Exercise 2.10

fresh-id という手続きについて云々。定義が以下らしい。

(define fresh-id
  (lambda (exp s)
    (let ((syms (all-ids exp)))
      (letrec ((loop (lambda (n)
		       (let ((sym (string->symbol
				   (string-append s
						  (number->string n)))))
			 (if (memv sym syms) (loop (+ n 1) sym))))))
	(loop 0)))))

ふむ。実行例も出てますが略。all-ids を定義しなさい、という事らしい。

続きを読む

Exercise 2.9

(a b c) を parse すると以下。

gosh> (parse-expression '(a b c))
(app-exp (free-info a) (free-info b))

あるいは (lambda) を parse すると以下。

gosh> (parse-expression '(lambda))
*** ERROR: pair required, but got ()

どうすりゃ良いのかな。51p な parse-expression だと datum が pair の場合は lambda と app 限定って考えると簡単っちゃ簡単なのかどうか。

続きを読む

Heroku にもひとつアプリを作って動作の確認の準備

GitHub で fork 作るかなとか思っていたのですが面倒なのでローカルでディレクトリをコピィすることにします。これはこれで微妙ですが仕方が無い、ってことで。
とりあえず

  • リポジトリなディレクトリをコピィ
  • .git/config 修正
  • heroku create

なのかどうか。後は plugin を云々して中身を書換えて git push してどうなるか。基本的には heroku run rake:db:migrate 程度で良いのかどうか。
へろへろ気味なのでぼちぼち進めてみます。

続きを読む

EoPL 読んでた記録の確認とその記録 (8)

Ex.2.8 です。ちょっとカン違いしてたのですが、以下は #t なんですね。

> (occurs-bound? 'x '(lambda (y) y))

occurs-bound? は以下なカンジ。

(define occurs-bound?
  (lambda (var exp)
    (cases lexical-address exp
	   (lit-exp (datum) #f)
	   (lex-info (id depth position) #t)
	   (free-info (id) #f)
	   (if-exp (test-exp true-exp false-exp)
		   (or (occurs-bound? var test-exp)
		       (occurs-bound? var true-exp)
		       (occurs-bound? var false-exp)))
	   (lambda-exp (id body)
		       (or (occurs-bound? var body)
			   (and (eqv? var id)
				(occurs-free? var body))))
	   (app-exp (rator rand)
		    (or (occurs-bound? var rator)
			(occurs-bound? var rand))))))
続きを読む