lisp の macroで遊ぶ
2007/06/30
前のエントリ id:smeghead:20070628:loop
しばらく、macroは放っておこうとしていたんですが、my-forを弄っている自分がいました。
my-forにcontinueとbraekを付けてみました。
(defmacro !break () `(go done)) (defmacro !continue () `(go end)) (defmacro my-for (init-form test-form inc-form &body body) `(let ,init-form (tagbody begin (if (not ,test-form) (go done)) ,@body end ,inc-form (go begin) done)))
!break と !continue をインライン関数的に定義して、繰り返しを自前で制御するようにしただけです。
(my-for ((i 0)) (< i 10) (incf i) (princ i) (if (= 3 i) (!break)))
実行結果
0123
(my-for ((i 0)) (< i 3) (incf i) (my-for ((j 0)) (< j 3) (incf j) (if (= j 1) (!continue)) (format t "~d~d " i j) ) (terpri))
実行結果
00 02 10 12 20 22
まとめ
値は返せないし、my-forがネストしたときには、1段階目しか制御できないし、!break !continueがグローバル空間を汚してるし。
おもちゃレベルのお遊びです。こんな自作forを使うくらいなら、用意されたloopを使った方が100倍いいと肌で感じたことは、収穫かもしれません。
あと、macroおもしろいかもw 後回しにしようとしてたけど、あんまり構えずに触ってみるかもです。