Что делает эта схема-val? - PullRequest
1 голос
/ 27 марта 2012
#lang eopl

(define-datatype env env?
  (empty-env)
  (extended-env (var symbol?)
                (val scheme-val?)
                (envi env?)))

(define (scheme-val? x) #t)

; examples
(define e-env (empty-env))
(define e1 (extended-env 'x 1 (extended-env 'y #f e-env)))

Я не понимаю, как используется scheme-val?. Почему существует x, и почему мы возвращаем #t? Окружение - это функция, связывающая переменную со значением.

Итак, в примере мы связываем x = 1 и y = #f, верно?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

scheme-val? - это функция, которая должна возвращать #t (true), если переданное ей значение относится к этому типу (в данном случае, "схема-значение").Так же, как symbol? возвращает true для символов и false для всего остального, scheme-val? вернет true для любого объекта, который является схемой-val.

Оказывается, что в этом случае scheme-val?возвращает true для всего - таким образом, все является схемой.x существует потому, что предикат должен принимать один аргумент, он просто игнорирует аргумент и возвращает #t для всего.

Это важно в этом случае, потому что вы заметите define-datatype, он принимает значение и предикат для проверки его типа (env - это значение, env? - это предикат).

Очевидно, extended-env также принимает аналогичные предложения.В данном случае их три: var, что является symbol?, val, что является scheme-val? и env, что является env?.

1 голос
/ 27 марта 2012

В схеме #t означает логическое значение true, #f - значение false. Остальное я не совсем понимаю, но предлагаю отладчик DrRacket, чтобы посмотреть, что происходит.

(define e-env (empty-env))

присваивает e-env значение empty-env

(define (scheme-val? x) #t)

определяет анонимную функцию, которая принимает параметр x, и, если это scheme-val (в данном случае, что угодно), возвращает #t.

Результат e1 после выполнения этого кода:

#(struct:extended-env x 1 #(struct:extended-env y #f #(struct:empty-env)))

так e1 является extended-env with var='x, val=1, envi=(extended-env with var='y, val=#f, envi=e-env)

(мне кажется)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...