4

我正在尝试为数字电子课程制作一个真值表生成器,因为这就是我在业余时间获得乐趣的方式,而不是评判我。

Anywho,我想我会有一个哈希值,字符串等效于运算符作为键,而与这些运算符相对应的 Scheme 过程作为值。

例如

(定义运算符表#hash((“+”。或)
                              (“*“ 。 和)))

所以我可以做类似的事情

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

现在我意识到上面的方法可能无法正常工作,但事实上我什至无法修改它,直到我做对了,因为显然and并且or在 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)]。

4

2 回答 2

6

如果您想使用andand的函数形式or(限制它们不会短路)并且不丢失变量 arity 属性,那么您可以轻松地这样做:

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

(values是 (PLT) Scheme 中惯用的恒等函数。)

于 2009-11-02T03:59:23.817 回答
3

是的,它们不能是过程,因为 Scheme(像大多数语言一样)是一种“渴望”的语言——在过程控制(接收参数值)之前,过程的每个参数都会被评估。 and并且or需要“短路”——一旦知道最终结果就停止参数评估——所以它们不能是任何急切语言中的常规过程/函数(“惰性”语言,如 Haskell——其中每个参数仅在需要时才评估 - 是一个非常不同的品种,并且不需要这种“常规函数”与“特殊形式”的区别......但是,唉,Scheme只是不是其中之一! )。

于 2009-11-02T03:19:15.117 回答