[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:03651] Re: 小ネタ還元



おまけです。蛇足でなければいいけど^^;

|> (while t 
|>     なんちゃら
|>     (if なんちゃら (return 値))
|>     ほんちゃら
|> )
|> とか、
|
|LISPだとブロックを抜けるときも return だったんですね。

returnは一番内側のループからしか抜けないので、2重3重になった
ループからの抜け出すコード例です。

(defun test1 (lstlst)
  (dolist (lst lstlst)
    (dolist (a lst)
      (if (zerop a) (return-from test1 t)))) ;;ゼロがあったら関数から抜ける。
  nil)

(test1 '((1 2 3)(3 0 5)))
--> t
(test1 '((1 2 3)(3 0 5)))
--> nil

---------------------------------
(defun test2 () 1) こうやって

(symbol-function 'test2) こうやる [実際の関数定義を覗いてみる]と
--> #<lexical-closure: (lambda nil (block test2 1))>
                                          -----
                                          暗黙のブロックtest2ができています。

なので、先ほどの例は、(return-from test1 値)で関数から抜け出せます。

---------------------------------
ちなみに
(macroexpand '(return 12))
--> (return-from nil 12)
なので、(return 値) == (return-from nil 値)です。

do, dolist, while ・・・は、「暗黙のブロックnil」が出来ているので
(return 値)は最も内側のループを抜ける動作になります。

------------------------------------------------------------
逸見雅人    Masahito Henmi  henmi@xxxxxxxxxxxxx
♪あなたの願いも仕事もうまくいきますように・・・

Index Home