タグ

2009年1月23日のブックマーク (2件)

  • labelsとfletの違い - Nobuhisa's diary

    labelsは主に関数定義を入れ子にしたい場合に用いますが、fletというものもあるみたい。 外側(defun)と内側(labels,flet)の関数名が同一であった場合、内側の関数で再帰呼び出しをすると果たして誰にお呼びがかかるのか。labelsとfletはその時の振る舞いが異なるらしい。 labelsはあくまで自分自身。fletは外側の関数を呼び起こす。 ;; labels CL-USER> (defun foo (x) (format t "YesWeCan") (if (> x 0) (labels ((foo (x) (format t "!") (if (> x 0) (foo (1- x))) )) (foo x) ))) FOO CL-USER> (foo 5) YesWeCan!!!!!! NIL ;; flet CL-USER> (defun bar (x) (form

    labelsとfletの違い - Nobuhisa's diary
    pipehead
    pipehead 2009/01/23
    > 外側(defun)と内側(labels,flet)の関数名が同一であった場合、内側の関数で再帰呼び出しをすると果たして誰にお呼びがかかるのか。labelsとfletはその時の振る舞いが異なるらしい。labelsはあくまで自分自身。fletは外側の関数を
  • flet と labels の違い - 日々ごちゃごちゃと考える

    どこかでどっちかは再帰ができないとか聞いた気がしたので確かめてみた。 (defun hoge (&optional arg) 'defun) => hoge (flet ((hoge (&optional arg) (if arg (hoge) 'flet))) (values (hoge t) (hoge nil))) => defun => flet (labels ((hoge (&optional arg) (if arg (hoge) 'labels))) (values (hoge t) (hoge nil))) => labels => labels flet のローカル関数定義部分では、外のスコープの関数定義を参照する。labels のそれでは、labels で定義しているローカル関数を参照する。てことは labels では再帰できるが flet ではできない。 (flet

    flet と labels の違い - 日々ごちゃごちゃと考える
    pipehead
    pipehead 2009/01/23
    > flet のローカル関数定義部分では、外のスコープの関数定義を参照する。labels のそれでは、labels で定義しているローカル関数を参照する。てことは labels では再帰できるが flet ではできない。