[xyzzy:03651] Re: 小ネタ還元
- Subject: [xyzzy:03651] Re: 小ネタ還元
- From: masahito henmi <henmi@xxxxxxxxxxxxx>
- X-mailer: Denshin 8 Go V321.2b5
おまけです。蛇足でなければいいけど^^;
|> (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
♪あなたの願いも仕事もうまくいきますように・・・