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!
返回
(或类似的虚无)。您的lambda
wadd
执行以下操作:

  • 检查
    L
    是否为空,并计算为0或
    i
    +
    (汽车L)
    ,然后丢弃结果
  • 修改
    i
    并计算为空
  • 修改
    L
    并不返回任何内容
  • 如果在lambda中放入多个语句,它们将被明确地包装在
    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!
    返回
    (或类似的虚无)。您的lambda
    wadd
    执行以下操作:

  • 检查
    L
    是否为空,并计算为0或
    i
    +
    (汽车L)
    ,然后丢弃结果
  • 修改
    i
    并计算为空
  • 修改
    L
    并不返回任何内容
  • 如果在lambda中放入多个语句,它们将被明确地包装在
    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)))