PLT Scheme noob:布尔和/或不是程序?

时间:2009-11-02 03:10:53

标签: scheme boolean racket

我正在尝试为数字电子课程制作一个真值表生成器,因为这是我在业余时间玩得开心并且不评判我的方式。

Anywho,我认为我有一个哈希,其中字符串等价于运算符作为键,而Scheme程序对应于那些运算符作为值。

E.g。

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

所以我可以做类似

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

现在我意识到上面的内容可能无法正常工作,但因为在我做对了之前我甚至无法修补它,因为显然andor在Scheme中是特殊的。在REPL,如果我输入not,则会回复#<procedure:not>。但是如果我给它andor,它会说and: bad syntax in: and。我可以使用and的程序版本吗?或者我必须使用lambda创建一个?或者我完全错过了什么?

我不只是从一开始就使用lambda的唯一原因是我不想失去内置and的变量能力[我能做(and #t #f)以及(and #t #f #f #t #f #t)]。

2 个答案:

答案 0 :(得分:6)

如果您想使用andor的函数形式(限制它们不会短路)并且不丢失变量arity属性,那么您可以轻松地执行此操作:

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

values是(PLT)Scheme中的惯用身份函数。)

答案 1 :(得分:3)

是的,它们不能成为程序,因为Scheme(像大多数语言一样)是一种“渴望”的语言 - 在程序获得控制权(接收参数值)之前,会对程序的每个参数进行评估。 andor需要“短路” - 一旦知道最终结果就停止参数评估 - 因此它们不能成为任何急切语言的常规程序/功能(“懒惰” “Haskell之类的语言 - 每个参数仅在需要的时候和根据需要进行评估 - 是一个非常不同的品种,而不是需要这个”常规函数“与”特殊形式“区别......但是,唉,Scheme不是其中之一!)。