The Little Schemerで遊んでいて、作業しながらアイデアを試しています (すべてがうまくいくわけではありません)。ちょうど今、私は第 6 章 (ヘルパー関数を紹介する場所) にいて、一歩が手の届くところにあると感じています。その一歩を踏み出す方法がわかりません。
本のコードは次のとおりです。
(define (^ b e) (expt b e))
(define (x a b) (* a b))
(define value-i
(lambda (nexp)
(cond
((atom? nexp) nexp)
((eq? (car (cdr nexp)) '+) (+ (car nexp) (value-i (caddr nexp))))
((eq? (car (cdr nexp)) 'x) (x (car nexp) (value-i (caddr nexp))))
(else
(^ (car nexp) (value-i (caddr nexp))))
)))
次のヘルパーが定義されています。
(define (operator-i aexp) (car (cdr aexp)))
(define (firstSubExp-i aexp) (car aexp))
(define (secondSubExp aexp) (caddr aexp))
そして、この単純化が行われます:
(define value-i2
(lambda (nexp)
(cond
((atom? nexp) nexp)
((eq? (operator-i nexp) '+) (+ (firstSubExp-i nexp)
(value-i2 (secondSubExp nexp))))
((eq? (operator-i nexp) 'x) (x (firstSubExp-i nexp)
(value-i2 (secondSubExp nexp))))
(else
(eq? (operator-i nexp) '^) (^ (firstSubExp-i nexp)
(value-i2 (secondSubExp nexp))))
)))
私が見ることができる単純化は、すべてが有効であると仮定しているため、ボイラープレートnexp
を繰り返す必要がないということです。((eq? (operator-i nexp) ...
次のようなものが機能するはずです。
(define value-i3
(lambda (nexp)
(cond
((atom? nexp) nexp)
(else
((operator-i nexp)
(firstSubExp-i nexp)
(value-i3 (secondSubExp nexp))))
)))
...そうでないことを除いて。Exception: attempt to apply non-procedure ...
(+、x、^ のいずれか) でエラーになります。
で関数を呼び出そうとしていることを認識しないことが問題であることがわかります(operator-i nexp)
。
返す関数を適用したいことをインタプリタに明確にするにはどうすればよい(operator-i nexp)
ですか?
他のヒントも大歓迎です(私はプチシェスキームを使用しています)。