Onlisp
13章「コンパイル時の計算処理」
新しいユーティリティー
- この例は微妙な気がする。
Bezier曲線
- 定数値が与えられるなら、コンパイル時に計算を移せる。
- 普通ならコンパイラがやる機能を人間ができる。
- ok
14章「アナフォリックマクロ」
アナフォリックな変種オペレーター
- aandは以下の方がきれいだと思うがだめだろうか?
(defmacro aand (&rest forms) (if (cdr forms) `(let ((it ,(car forms))) (and it (aand ,@(cdr forms)))) (aif (car forms) it t)))
(defmacro awhile (expr &body body) (let ((it (intern "IT"))) `(do ((,it ,expr ,expr)) ((not ,it)) ,@body)))
- awhileは使える。
- with-open-fileなどと組み合わせるととてもいい。
>(with-open-file (s "./data.log") (awhile (read-line s nil nil) (print it))) "abc" "def" "ghi" NIL
- alambdaにはびっくりした。無名再帰関数はY-combinatorとかでやるしかないのかとおもってた。
- いとも簡単に定義できてる。
(defmacro alambda (parms &body body) (let ((self (intern "SELF"))) `(labels ((,self ,parms ,@body)) #',self))) >(funcall (alambda (x) (if (= x 0) 1 (* x (self (1- x))))) 10) 3628800
- たしかにこうやればできる。
失敗
- ok
参照透明性
- ok