lisp の macroで遊ぶ

前のエントリ 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 後回しにしようとしてたけど、あんまり構えずに触ってみるかもです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください