2012-12-04 27 views
1
(define [DML vara] 
    (cond 
    ((atom? (car vara)) 
     (cond 
     ((eqan? (car vara) 'N) 
     (display (cdr vara))) 
     (else (negate vara))) 

    ))) 

我目前正在试图挽救回的内容,现在为了简单起见,我在测试的否定功能为“返回”名单,我想救该功能的结果做测试。我如何实际保存从否定列表返回。 类似(x =(negate vara))其中x是列表。我看起来让谷歌和堆栈溢出,但我找不到一个非常简单的基本任务。方式存储功能的结果,(让)

原谅我的计划,我只是starting..and从命令式语言去功能不好的语法也不是那么顺畅..

编辑:

我想打印出来的结果表达式(否定vara),但由于计划只打印出最后一次“递归调用”(请原谅我的错误措辞)。我想它使用来自(否定翻)所产生的名单,但仍然打印出清单像

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

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

伪代码不清楚。你为什么不用你选择的另一种编程语言编写一个完整的_working_例子(意思是:编译并实际运行的例子)? –

回答

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 
+0

嗯,那么如何将30保存到一个新的列表中,我可以稍后调用like(dispaly z)来显示更新的内容? –

+0

你为什么不在那里展示结果?请记住:'let'中的变量只存在于它的主体范围内,与定义范围的其他编程语言相同。如果您在问题中显示您想要做什么_exactly_,可以使用伪代码或另一种编程语言中的代码来展示您的观点,这会非常有用。 –

+1

另外注意,如果你想把结果保存到'let'外面的某个列表中,你将需要可变状态,虽然这是可能的,但它不会是一种精神上的函数编程风格的方法的计划。也许你应该重新评估你的方法,并将其调整为功能风格。 –

0

像你提出你可以做一个程序:

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

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