1
(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
4

2 回答 2

0

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

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

=> 30

上面的表达式将值绑定到两个变量,x并且y. 这些绑定将存在于let. 隐式地,let表单中的所有表达式都封装在 abegin中,整个表达式的最终结果就是最终的表达式。请注意,一个绑定不能在定义部分引用其他绑定;如果一个变量需要引用以前的定义,则使用 a 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
于 2012-12-04T00:53:58.310 回答
0

你可以像你建议的那样做一个程序:

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

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

于 2013-05-26T01:09:19.250 回答