【问题标题】:No operation in Scheme LanguageScheme语言中没有操作
【发布时间】:2014-04-14 22:32:08
【问题描述】:

我在如何用方案语言定义无操作时遇到了一些麻烦

喜欢;在c

我想做这样的事情:

   (cond
   [(null? exp)  nop ]
    .....
   )

如果我把它留空,它将返回#t 谢谢!

【问题讨论】:

  • 每个表达式都必须返回一个值。如果您想要无操作,请使用void 类型[1]。要返回 void 值,请使用 (void)。 [1]:docs.racket-lang.org/reference/…

标签: functional-programming scheme conditional-statements


【解决方案1】:

请注意,函数式程序与命令式程序不同。您应该始终在每个表达式/函数中考虑返回某些内容(该表达式的结果或值)。对于条件语句,您必须小心地在所有不同的分支中维护这个“东西”,因为您的表达式在任何情况下都必须产生一个值。

然后,您必须决定在这种情况下要返回什么,并相应地构建代码。如果不想返回#t,可以只返回#f 或空列表:

(cond
  [(null? exp) #f]
  .....
  )

事实上,如果你仔细想想,C 中“无操作”(即什么都不做)的概念与“产生一些价值”几乎相同,因为除了产生之外你什么都不做值,它不会在您的程序中引起任何变化。

【讨论】:

    【解决方案2】:

    Scheme 没有语句,只有 表达式。每个表达式都会返回一个值——或者可能永远不会返回——

    所以你想要一个计算量不大的表达式。为此,您可以使用 nil(或 #f,或任何其他值):

     (cond
       ((null? exp)  ())
      ....
     )
    

    如果您编写的条件只有一个测试 - 并且没有“then”主体子表达式

     (cond
       ((null? exp))
     )
    

    那么当exp 为nil 时cond 的结果就是(null? exp) 测试的结果#t 实际上,当exp 为空时,您可以只返回exp 本身。

    【讨论】:

      【解决方案3】:

      您可能应该更改您的程序以消除无用的情况。但是,如果您只需要一个 nil 值,标准答案是说 (if #f #f),如果它始终为假但没有假表达式,则它是单腿的,因此不返回任何内容。

      【讨论】:

      • 对于方括号的 OP 用法,他或她正在使用 Racket。这在 Racket 中是不允许的,因为恰恰是它没有产生任何价值。
      • 问题被标记为 Scheme,而不是 Racket。而且大多数 Scheme 系统都接受方括号,而不仅仅是 Racket,所以我认为我们不能假设 Racket。例如,我在 Chez Scheme 中进行了测试,它运行良好。我知道 Racket 不再是 Scheme,但不知道这会在 Racket 中失败。我仍然认为最好的答案是重写 cond 表达式以消除无用的子句。
      • @user448810 你是对的,我确实需要重新安排我的条件才能让程序正常工作,而且我还使用了 Basile Starynkevitch 解决方案。所以谢谢你们!
      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2011-10-31
      • 2014-09-30
      • 2017-10-24
      • 2017-08-14
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多