【问题标题】:Scheme storing the result of a function (Let)存储函数结果的方案 (Let)
【发布时间】:2012-11-21 13:52:09
【问题描述】:
(define [DML vara] 
  (cond
     ((atom? (car vara)) 
      (cond
        ((eqan? (car vara) 'N)
         (display (cdr vara)))
        (else (negate vara)))

   )))

为了简单起见,我目前正在尝试保存返回的内容,我正在测试它“返回”一个列表的否定函数,我想保存该函数的结果以进行测试。我如何实际保存从否定返回的列表。 有点像 (x = (negate vara)) 其中 x 是列表。我在 google 和 stack over flow 上查找 let,但我找不到一个非常简单的基本任务。

请原谅我刚刚开始的方案语法不佳..从命令式语言到函数并不是那么顺利..

编辑:

我想打印出 (negate vara) 的结果表达式,但由于方案只打印出最后一个“递归调用”(请原谅我的措辞不好)。我希望它使用来自 (negate vara) 的结果列表,但仍然像

一样打印出该列表
say if I had 
(else (test (negate vara)))
...
(define (test vara)
(display "test")
)

I wanted it to display 
'(O a b)) ;list
here

【问题讨论】:

  • 伪代码不清楚。为什么不使用您选择的另一种编程语言编写一个完整的、工作示例(意思是:编译并实际运行的示例)?

标签: list scheme


【解决方案1】:

如您所知,let 表达式可以解决问题:

(let ((x 10)
      (y 20))
  (+ x y))

=> 30

上面的表达式将值绑定到两个变量xy。这些绑定将存在于let 的主体中。隐式地,let 形式中的所有表达式都封装在一个begin 中,整个表达式的最终结果就是最终的表达式。请注意,一个绑定不能在定义部分引用其他绑定;如果一个变量需要引用之前的定义,那么使用let*:

(let* ((x 10)
       (y (* x 2)))
  (+ x y))

=> 30

最后,如果您需要创建递归定义,请使用letrec

(letrec ((fact (lambda (x)
                 (if (zero? x) 1 (* x (fact (sub1 x)))))))
  (fact 10))

=> 3628800

【讨论】:

  • 嗯,那么如何将 30 保存到一个新列表中,以便稍后使用 like (dispaly z) 调用以显示更新的内容?
  • 为什么不直接显示结果呢?请记住:let 中的变量仅存在于其主体的范围内,它与任何其他定义范围的编程语言相同。如果您作为问题的一部分显示您想要做什么确切,使用伪代码或其他编程语言中的代码来证明您的观点,这将很有用。
  • 另外请注意,如果您想将结果保存到“let”“外部”的某个列表中,您将需要可变状态,尽管有可能,但它不是一个函数式本着 Scheme 精神的编程风格的方法。也许您应该重新评估您的方法,并将其调整为实用风格。
  • 我用我想做的事情更新了这个问题。我知道这不是设计语言的方式。有没有其他方法可以做我想做的事?
【解决方案2】:

您可以按照您的建议进行程序:

(define (test var)
  (display var)
  var)
(test (negate (test vara)))) ; prints our argument and return

或者您可以使用 DrRacket 并使用调试器。用过一次就错过了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2012-06-05
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多