Reasoned Schemer (76) defrel
defrel
登場
> (defrel (teacupo t) (disj2 (== 'tea t) (== 'cup t)))
> (run* x (teacupo x))
'(tea cup)
このdefrel
はこの定義と同じ
(define (teacupo t)
(lambda (s) (lambda () ((disj2 (== 'tea t) (== 'cup t)) s))))
この内側のlambda ()
なんだっけ
マクロは
(define-syntax defrel
(syntax-rules ()
((defrel (name x ...) g ...)
(define (name x ...)
(lambda (s)
(lambda () ((conj g ...) s)))))))
lambda ()
あるな
lambda ()
ないとダメなんだっけ
> (define (teacupo t)
(lambda (s) ((disj2 (== 'tea t) (== 'cup t)) s)))
> (run* x (teacupo x))
'(tea cup)
動くな
goalって何だっけ
A goal is a function that expects a substitution and, if it returns, produces a stream of substitutions.
substitutionを引数にとって、substitutionのstreamを返す関数
lambda ()
なくても定義には外れてない気もする
substitutionを与えたときにとりあえず何か返すようにしたい?
なんだっけ?
もうちょっと見てみよう
((teacupo x) empty-s)
= ((lambda (s) (lambda () ((disj2 (== 'tea x) (== 'cup x)) s))) empty-s)
= (lambda () ((disj2 (== 'tea x) (== 'cup x)) empty-s))
おっとこれだと終わってしまう
take-inf
からやらないとダメか
(take-inf #f ((teacupo x) empty-s))
= (take-inf #f (lambda () ((disj2 (== 'tea x) (== 'cup x)) empty-s)))
= (take-inf #f ((disj2 (== 'tea x) (== 'cup x)) empty-s))
= (take-inf #f `(((,x . tea)) ((,x . cup))))
= `(((,x . tea)) ((,x . cup)))
take-inf
がlambda ()
をひと皮向いてくれるけどそれだけだなあ
lambda ()
がないといけない理由はわからない
きっと何かで困るんだろうけど
disj2
の評価順には影響しそう append-inf
のところで
悪い影響が出るとすると止まらなくていいときに止まってしまうとかかな
気にしながら進むか
忘れそうだけど