ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

Lisp in Small Pieces 1.7 Global Environment

初期値やデフォルトで使える関数を、Global environment に追加するマクロ

(define env.global env.init)

(define-syntax definitial 
  (syntax-rules ()
    ((definitial name)
     (begin (set! env.global (cons (cons 'name 'void) env.global))
            'name ) )
    ((definitial name value)
     (begin (set! env.global (cons (cons 'name value) env.global))
            'name ) ) ) )

(define-syntax defprimitive 
  (syntax-rules ()
    ((defprimitive name value arity)
     (definitial name 
        (lambda (values) 
          (if (= arity (length values))
              (apply value values)       ; The real apply of Scheme
              (wrong "Incorrect arity"
                     (list 'name values) ) ) ) ) ) ) )

;;定義済みの変数
(definitial t #t)
(definitial f the-false-value)
(definitial nil '())

tやf以外でなぜか定義済みの変数。これらの名前を定義しておくと、評価器をテストするLisperが思いつく名前の約96.037%をカバーするらしい。この辺がジョークなのかマジなのかわからない。

(definitial x)
(definitial y)
(definitial z)
(definitial a)
(definitial b)
(definitial c)
(definitial k)
(definitial foo)
(definitial bar)
(definitial hux)
(definitial fib)
(definitial fact)
(definitial visit)
(definitial length)
(definitial primes)

次は、自作処理系の関数を、それを動かすScheme処理系の関数に対応付けている所。後ろの数字は、引数の個数を示す。

(defprimitive cons cons 2)
(defprimitive car car 1)
(defprimitive cdr cdr 1)
(defpredicate pair? pair? 1)
(defpredicate symbol? symbol? 1)