2010/04/29

TSS define?

わりとどうでも良い話です。

10章(The Little Schemer, 4th Edition)では、defineのない小さなLisp処理系を作りました。
20章(The Seasoned Schemer)ではdefineのある小さなLisp処理系を作るようです。そこでリストの先頭が(quote define)であるかどうかを判定するdefine?という手続きを作るわけです。
(define (define? e)
(cond
((atom? e) #f)
((atom? (car e))
(eq? (car e)(quote define)))
(else #f)))
view raw defne?1.scm hosted with ❤ by GitHub
上記のようなコードが記載されています。The Little Schemer, 4th Edition でも The Seasoned Schemerでも、このスタイルです。不恰好ですよね。そこで、もう少しどうにかならないものかと考えてみるわけです。
(define (define? e)
(let ((kar (if (atom? e)
#f
(car e))))
(eq? kar 'define)))
(define (define? e)
(eq? (if (pair? e)
(car e)
#f) 'define))
(define (define? e)
(eq? (and (pair? e)
(car e)) 'define))
view raw define?2.scm hosted with ❤ by GitHub

書いてはみるものの、微妙です。微妙なので取り合えずブログに書いとけ、と思うわけです。ただそれだけです。

追記

そうでしたよ。Common Lispなら、こんなどうでも良いこと気にもならんのですよね。
(defun define-p (e)
(if (consp e)
(eq (car e) 'define)))
view raw define?.lisp hosted with ❤ by GitHub


The Little Schemer, 4th EditionThe Seasoned Schemer

0 件のコメント:

コメントを投稿