0

スキームで数式を評価しようとしています:

(define formula '(if (or (equal? '?country 'United-States) (equal? '?country 'England))
                  #t
                  #f))
(define (eval-formula formula)
  (eval `(let ([?country 'United-States])
           (display formula) (newline)
           (display ?country) (newline)
           ,formula)))

(eval-formula formula)

http://docs.racket-lang.org/guide/eval.htmlを読むと #t が返されるはずですが、実行すると #f が返されます。私が誤解していたことを教えてください。

私も試しました:

(define formula '(if (or (equal? '?country 'United-States) (equal? '?country 'England))
                  #t
                  #f))
(define ?country 'United-States)
(eval formula)

しかし、私は同じ結果を得ました。

どうもありがとう!

4

1 に答える 1

0

あなたの定義でformulaは引用?countryしました - それは間違いです。これが動作です(注、私のスキームにevalは追加のenvironment引数が必要です):

(define formula '(if (or (equal? ?country 'United-States) (equal? ?country 'England))
                  #t
                  #f))

(define (eval-formula formula)
  (eval `(let ([?country 'United-States])
           (display formula) (newline)
           (display ?country) (newline)
           ,formula)
    (interaction-environment)))

> (eval-formula formula)
(if (or (equal? ?country 'United-States) (equal? ?country 'England)) #t #f)
United-States
#t

これを改善するにはいくつかのことがあります。は本当に必要ありませんif(#tまたは#fの結果として得られますor)。eval-formula国の名前に追加の引数を渡すことができます。そのように(display削除して):

> (define (eval-formula formula country)
  (eval `(let ([?country ',country]) ,formula)
    (interaction-environment)))
> (eval-formula formula 'United-States)
#t
> (eval-formula formula 'England)
#t
> (eval-formula formula 'Japan)
#f

formula実際にwithが与えられた(quote ?country)場合は、新しいformulawith ?countryunquoted with を生成できます:

(define (unquoting identifiers expression)
  (if (null? expression)
      '()
      (let ((next (car expression)))
        (cons (cond ((not (pair? next)) next)
                    ((not (null? next))
                     (if (and (eq? 'quote (car next))
                              (member (cadr next) identifiers))
                         (cadr next) ; unquote here
                         (unquoting identifiers next)))
                    (else 'error))
          (unquoting identifiers (cdr expression))))))

 (set! formula (unquoting '(?country) formula)
于 2013-03-29T21:22:57.440 に答える