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)

阅读应该返回#t的http://docs.racket-lang.org/guide/eval.html ,但是当我运行它时,它返回#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

事实上,如果你得到了formulawith(quote ?country)那么你可以产生一个 new 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 回答