kb84tkhrのブログ

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

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-inflambda ()をひと皮向いてくれるけどそれだけだなあ
lambda ()がないといけない理由はわからない
きっと何かで困るんだろうけど
disj2の評価順には影響しそう append-infのところで
悪い影響が出るとすると止まらなくていいときに止まってしまうとかかな

気にしながら進むか
忘れそうだけど