我正在尝试为数字电子课程制作一个真值表生成器,因为这是我在业余时间玩得开心并且不评判我的方式。
Anywho,我认为我有一个哈希,其中字符串等价于运算符作为键,而Scheme程序对应于那些运算符作为值。
E.g。
(define operator-table #hash(("+" . or) ("*" . and)))
所以我可以做类似
的事情(lambda (a b) ((hash-ref operator-table (string-ref input-str i)) a b))
现在我意识到上面的内容可能无法正常工作,但因为在我做对了之前我甚至无法修补它,因为显然and
和or
在Scheme中是特殊的。在REPL,如果我输入not
,则会回复#<procedure:not>
。但是如果我给它and
或or
,它会说and: bad syntax in: and
。我可以使用and
的程序版本吗?或者我必须使用lambda
创建一个?或者我完全错过了什么?
我不只是从一开始就使用lambda的唯一原因是我不想失去内置and
的变量能力[我能做(and #t #f)
以及(and #t #f #f #t #f #t)
]。
答案 0 :(得分:6)
如果您想使用and
和or
的函数形式(限制它们不会短路)并且不丢失变量arity属性,那么您可以轻松地执行此操作:
(define (and* . xs) (andmap values xs))
(define (or* . xs) (ormap values xs))
(values
是(PLT)Scheme中的惯用身份函数。)
答案 1 :(得分:3)
是的,它们不能成为程序,因为Scheme(像大多数语言一样)是一种“渴望”的语言 - 在程序获得控制权(接收参数值)之前,会对程序的每个参数进行评估。 and
和or
需要“短路” - 一旦知道最终结果就停止参数评估 - 因此它们不能成为任何急切语言的常规程序/功能(“懒惰” “Haskell之类的语言 - 每个参数仅在需要的时候和根据需要进行评估 - 是一个非常不同的品种,而不是需要这个”常规函数“与”特殊形式“区别......但是,唉,Scheme不是其中之一!)。