Scheme 为什么';这个计划是否如预期的那样有效?
这不会返回任何结果。我希望它能做到Scheme 为什么';这个计划是否如预期的那样有效?,scheme,r5rs,Scheme,R5rs,这不会返回任何结果。我希望它能做到(3+(2+(9+1)),这应该等同于15。我是否使用了set!错误的方法?我不能在if条件下调用set!。我认为如果你修复了缩进,你的问题会变得更加明显 函数set!返回(或类似的虚无)。您的lambdawadd执行以下操作: 检查L是否为空,并计算为0或i+(汽车L),然后丢弃结果 修改i并计算为空 修改L并不返回任何内容 如果在lambda中放入多个语句,它们将被明确地包装在begin语句中: (define wadd (lambda (i L)
(3+(2+(9+1))
,这应该等同于15
。我是否使用了set!
错误的方法?我不能在if
条件下调用set!
。我认为如果你修复了缩进,你的问题会变得更加明显
函数set!
返回
(或类似的虚无)。您的lambdawadd
执行以下操作:
L
是否为空,并计算为0或i
+(汽车L)
,然后丢弃结果i
并计算为空L
并不返回任何内容begin
语句中:
(define wadd (lambda (i L)
(if (null? L) 0
(+ i (car L)))
(set! i (+ i (car L)))
(set! L (cdr L))))
(wadd 9 '(1 2 3))
在序列中包含多个表达式的begin
语句中,整个begin
计算结果为最后一个语句的结果:
(lambda () 1 2 3) => (lambda () (begin 1 2 3))
我认为如果你修正你的缩进,你的问题会变得更加明显 函数
set!
返回
(或类似的虚无)。您的lambdawadd
执行以下操作:
L
是否为空,并计算为0或i
+(汽车L)
,然后丢弃结果i
并计算为空L
并不返回任何内容begin
语句中:
(define wadd (lambda (i L)
(if (null? L) 0
(+ i (car L)))
(set! i (+ i (car L)))
(set! L (cdr L))))
(wadd 9 '(1 2 3))
在序列中包含多个表达式的begin
语句中,整个begin
计算结果为最后一个语句的结果:
(lambda () 1 2 3) => (lambda () (begin 1 2 3))
我从您的代码推断,您打算以某种方式遍历列表,但是
wadd
过程中没有迭代列表的内容-没有递归调用,没有循环指令,什么都没有:只是一个误用的条件和两个只执行一次的集合。
s。我不会尝试在问题中修复该过程n、 无法修复-我宁愿向您展示解决问题的正确方法。您希望按照以下思路:
(begin 1 2 3) => 3
执行时,前面的过程将计算此表达式:(wadd 9'(1 2 3))
如下:
(+3(+2(+19))
。请注意,正如@Maxwell所指出的,上述操作可以通过以下方式更简洁地表达:
一般来说,在Scheme中,您不会使用赋值(set!指令)正如您在命令式、类似C的语言中所做的那样频繁—首选函数式编程风格,它严重依赖于递归和不改变状态的操作。我从您的代码中推断,您打算以某种方式遍历列表,但在
wadd
过程中没有迭代列表的内容—没有recursive调用,没有循环指令,什么都没有:只是一个误用的条件和几个只执行一次的set!
s。我不会尝试修复这个问题中的过程,它无法修复-我宁愿向您展示解决问题的正确方法。您希望按照以下思路:
(begin 1 2 3) => 3
执行时,前面的过程将计算此表达式:(wadd 9'(1 2 3))
如下:
(+3(+2(+19))
。请注意,正如@Maxwell所指出的,上述操作可以通过以下方式更简洁地表达:
作为一般规则,在Scheme中,您不会像在命令式C语言中那样频繁地使用赋值(set!
指令)——首选函数式编程风格,它严重依赖递归和不改变状态的操作。我想您的意思是:(3+(2+(1+9)),我想您的意思是:(3 + (2 + (1 + 9)))