题
我试图使一个数字电子技术课程的真表生成,因为这就是我的乐趣在我的业余时间,不评判我。
Anywho,我想我有字符串等效运营商密钥,并且该计划程序的对应于那些运营商值的散列。
E.g。
(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)
。
解决方案
如果要使用and
和or
的函数形式(与他们不会短路的限制),而不是输可变元数属性,则可以很容易地做到这一点:
(define (and* . xs) (andmap values xs))
(define (or* . xs) (ormap values xs))
(values
是在惯用的恒等函数(PLT)方案。)
其他提示
是的,它们不能被程序因为Scheme(最喜欢的语言)是一种“热心”的语言 - 该过程需要控制(接收参数值)之前每一个参数的过程被评价。 and
和or
需要“短路” - 只要最后的结果是已知的参数停止评价 - 所以他们不能正常程序/任何渴望语言功能(“懒”的语言,如哈斯克尔 - 其中每个参数计算仅仅是如果,在需要时可 - 是一个非常不同的品种,也不要的需要的这种“常规功能”与“特殊形式”的区别......但是,唉,计划只是没有其中的一个!)。
不隶属于 StackOverflow