我试图使一个数字电子技术课程的真表生成,因为这就是我的乐趣在我的业余时间,不评判我。

Anywho,我想我有字符串等效运营商密钥,并且该计划程序的对应于那些运营商值的散列。

E.g。

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

所以我可以做类似

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

现在我实现以上可能会无法正常工作,但因为它是我甚至不能用它修补,直到我得到它的权利,因为很明显andor方案是特殊的。在REPL,如果我在not键入回复#<procedure:not>。但是,如果我给它andor,它说and: bad syntax in: and。有and的程序版本,我可以使用吗?还是我必须做出一个与lambda?还是我失去了一些东西完全?

的唯一原因,我不只是与拉姆达去从一开始走的是,我不希望失去内建and的可变参数数量的能力[我可以做(and #t #f)以及(and #t #f #f #t #f #t)

有帮助吗?

解决方案

如果要使用andor的函数形式(与他们不会短路的限制),而不是输可变元数属性,则可以很容易地做到这一点:

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

values是在惯用的恒等函数(PLT)方案。)

其他提示

是的,它们不能被程序因为Scheme(最喜欢的语言)是一种“热心”的语言 - 该过程需要控制(接收参数值)之前每一个参数的过程被评价。 andor需要“短路” - 只要最后的结果是已知的参数停止评价 - 所以他们不能正常程序/任何渴望语言功能(“懒”的语言,如哈斯克尔 - 其中每个参数计算仅仅是如果,在需要时可 - 是一个非常不同的品种,也不要的需要的这种“常规功能”与“特殊形式”的区别......但是,唉,计划只是没有其中的一个!)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top