2013-03-29 1 views
0

Я пытаюсь оценить формулу в схеме:Eval функция схемы с цитатой

(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) 

, но я получил тот же результат.

Большое спасибо!

ответ

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 с (quote ?country), то вы можете произвести новый formula с ?country некотируемого с:

(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) 
+0

Проблема в том, что я получаю некоторые формулы и некоторые значения для переменных (те, которые начинаются с?), и я должен возвращать true или false. Я попытался отладить его и оценил: (if (или (equal? ​​(Quote? Country) (quote United)) (равно? (Quote? Country) (quote England))) #t #f). Я пытаюсь удалить эту «цитату» перед страной. –

+0

Мой вопрос в том, как я могу опубликовать недостоверные данные? Country –

+0

Единственный вариант, который я могу увидеть, чтобы переписать 'formula' для замены' (quote? Country) 'только с'? Country'. Если вы попытаетесь переопределить 'quote', то это переопределение будет применяться к' (quote United States) 'и' (quote England) 'и вызывает проблемы с оценкой. – GoZoner