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