存储函数结果的方案(Let)

时间:2012-12-04 00:50:48

标签: list scheme

(define [DML vara] 
  (cond
     ((atom? (car vara)) 
      (cond
        ((eqan? (car vara) 'N)
         (display (cdr vara)))
        (else (negate vara)))

   )))

我目前正在尝试保存返回的内容,为了简单起见,我正在测试否定函数,它“返回”一个列表,我想保存该函数的结果来进行测试。如何从否定中实际保存列表返回。 有点像(x =(否定vara))其中x是列表。我抬头看谷歌和堆栈流量,但我找不到一个非常简单的基本任务。

请原谅我在方案上的不良语法,我刚刚开始......从命令式语言到功能不是那么顺利..

编辑:

我想打印出(否定vara)的结果表达式,但由于scheme只打印出最后一次“递归调用”(请原谅我的错误措辞)。我希望它使用(否定vara)结果列表,但仍打印出该列表,如

say if I had 
(else (test (negate vara)))
...
(define (test vara)
(display "test")
)

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

2 个答案:

答案 0 :(得分:0)

正如您所知,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

答案 1 :(得分:0)

你可以按照你的建议制作一个程序:

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

或者你可以使用DrRacket并使用调试器。使用一次后你会错过它!