Схема PLT noob: логическое и / или не процедуры? - PullRequest
4 голосов
/ 02 ноября 2009

Я пытаюсь создать генератор таблиц правды для курса по цифровой электронике, потому что так я получаю удовольствие в свободное время и не осуждаю меня.

В любом случае, я решил, что у меня будет хеш со строковым эквивалентом операторов в качестве ключей, и процедуры Scheme, которые соответствуют этим операторам в качестве значений.

* 1005 Е.Г. *

(define  operator-table #hash(("+" . or)
                              ("*" . and)))

Так что я мог бы сделать что-то вроде

(lambda (a b) ((hash-ref operator-table (string-ref input-str i)) a b))

Теперь я понимаю, что вышеупомянутое, вероятно, не будет работать правильно, но, поскольку это так, я даже не могу повозиться с этим, пока не получу это правильно, потому что, очевидно, and и or являются особенными в Схеме. На REPL, если я наберу not, он отвечает #<procedure:not>. Но если я дам ему and или or, там будет написано and: bad syntax in: and. Можно ли использовать версию процедуры and? Или я должен сделать один с lambda? Или я что-то упускаю полностью?

Единственная причина, по которой я не просто пошел с лямбдой с самого начала, заключается в том, что я не хочу терять способности переменной арности встроенного and [Я могу сделать (and #t #f) так же как (and #t #f #f #t #f #t)].

Ответы [ 2 ]

6 голосов
/ 02 ноября 2009

Если вы хотите использовать функциональную форму and и or (с ограничением на то, что они не будут закорачиваться) и не потерять свойство переменной arity, то вы можете легко сделать это:

(define (and* . xs) (andmap values xs))
(define (or*  . xs) (ormap values xs))

(values - идиоматическая функция идентификации в схеме (PLT).)

3 голосов
/ 02 ноября 2009

Да, они не могут быть процедурами, потому что Scheme (как и большинство языков) является «нетерпеливым» языком - каждый аргумент процедуры оценивается до того, как процедура получит контроль (получая значения аргумента). and и or необходимо «замкнуть накоротко» - прекратить оценку аргумента, как только будет известен конечный результат, чтобы они не могли быть обычными процедурами / функциями на любом нетерпеливом языке («ленивые» языки, например, как Haskell - где каждый аргумент оценивается только в том случае, если, когда и при необходимости, - это совсем другой вид, и не нужно это различие между "обычной функцией" и "специальной формой" ... но увы, схема просто не из тех!).

...