【问题标题】:PLT Scheme noob: Boolean and/or aren't procedures?PLT Scheme noob:布尔值和/或不是程序?
【发布时间】:2009-11-02 03:10:52
【问题描述】:

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

任何人,我想我应该有一个哈希值,字符串等效于操作符作为键,Scheme 过程对应于这些操作符作为值。

例如

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

所以我可以做类似的事情

(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) 以及 @ 987654333@].

【问题讨论】:

    标签: scheme boolean racket


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 一些注意事项: 1. PLT Scheme 不像任何方案——具体来说,它包括一个“惰性”方案方言,其中andorif 是普通函数。 2. 说惰性语言不需要这种区别是错误的——在某些情况下惰性语言需要特殊形式——例如,Haskell 中的where 仍然不是功能。此外,如果你想要任何类型的“严格”运算符(就像 Haskell 中包含的那样),那么这个运算符本身也必须是一种特殊形式!
      • 啊哈!这就说得通了!我没有考虑短路
      猜你喜欢
      • 1970-01-01
      • 2010-11-11
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 2012-11-23
      • 2017-12-13
      • 2011-04-02
      相关资源
      最近更新 更多