kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (54) 10章 call/fresh, reified variable

新たな変数を導入する

(define (call/fresh name f)
  (f (var name)))

fは変数を引数にとってgoalを返す関数
たとえば(lambda (fruit) (== 'plum fruit))

> (take-inf 1 ((call/fresh 'kiwi (lambda (fruit) (== 'plum fruit))) empty-s))
(((#(kiwi) . plum)))

変数を導入したところがすっとばされてる感じもするので
すこし途中を補足するとこう

  (call/fresh 'kiwi (lambda (fruit) (== 'plum fruit)))
= ((lambda (fruit) (== 'plum fruit)) (var 'kiwi))
= (== 'plum (var 'kiwi))

だったらtake-infなんてしなくてもよさそうな気がするけど
何かの布石?

> ((== 'plum (var 'kiwi)) empty-s)
(((#(kiwi) . plum)))

When would it make sense to use distinct symbols for variables?
When we present values.

ちょっとなんて言ってるのかよくわかりませんが
reified variableの話だそうで

reified variableの名前はreify-nameで作る

(define (reify-name n)
  (string->symbol (string-append "_" (number->string n))))

fresh variableにreified variableを対応付けるには``(,x . _0)のようにassociationを使う
こういうassociationを含むsubstitutionをreified-name substitutionと呼ぶ