Scheme 有人能解释一下下面的方案代码吗?

Scheme 有人能解释一下下面的方案代码吗?,scheme,Scheme,我一直在听斯坦福的,但我被下面的代码(来自第20课)弄糊涂了。有人能逐行解释一下这是怎么回事吗 谢谢 (define (flatten sequence) (cond ((null? sequence) '()) ((list? (car sequence)) (append (flatten (car sequence)) (flatten (cdr sequence)))) (

我一直在听斯坦福的,但我被下面的代码(来自第20课)弄糊涂了。有人能逐行解释一下这是怎么回事吗

谢谢

(define (flatten sequence)
  (cond ((null? sequence) '())
        ((list? (car sequence)) (append (flatten (car sequence))
                                        (flatten (cdr sequence))))
        (else (cons (car sequence)
                    (flatten (cdr sequence))))))
我很好地打印了它(插入一些换行符并缩进代码以显示其结构),还将
'()
替换为
(列表)
(具有相同的值),只是为了防止代码被错误地突出显示


+1.什么是竞争?如果您能解释一下其他关键词,我将不胜感激。谢谢

当我说cons ing时,我只是指
cons
过程。当您看到
(cons)
其中
是任何方案表达式或值,
是任何计算结果为列表的方案表达式时,
cons
将返回
,并在其前面加上
的值。例如,
(cons1(list 2 3 4))
返回列表
(list 1 2 3 4)
。事实上,Scheme中的
(列表1234)
只是编写
(cons1(cons2(cons3)(cons4’()))
的一种简短方式

另外两个您可能遇到问题的词是
car
cdr
。您可以将
(car)
视为
的第一个元素或头部,将
(cdr)
视为
的其余元素或尾部。例如,
(car(列表1234))
返回值
1
(cdr(列表1234))
返回列表
(列表1234)

如果你需要其他关键字的帮助,请告诉我

  • 定义函数以展平 序列

  • 对于空序列,返回empty

  • 如果列表的标题(汽车)是 序列返回的结果 将其展平附加到 尾部扁平化(cdr)

  • 否则将头部附加到扁平件上 尾巴


  • 哦,刚刚记住,方案注释以分号开头。但是当我把八角形改为分号时,突出显示会变得混乱…+1什么是矛盾?如果您能解释一下其他关键词,我将不胜感激。谢天谢地@Jeremy Ruten——你似乎对这个计划了如指掌!我怀念大学时代的计划
    # define a procedure 'flatten' that takes a list 'sequence'
    (define (flatten sequence)
      # if the 'sequence' is empty, return an empty list
      (cond ((null? sequence) (list))
            # if the first element of 'sequence' is itself a list, return a new list
            # made by appending the flattened first element of 'sequence' with the
            # flattened rest of the 'sequence'
            ((list? (car sequence))
             (append (flatten (car sequence))
                     (flatten (cdr sequence))))
            # if the first element of 'sequence' is not a list, return a new list
            # made by cons-ing that element with the flattened rest of the 'sequence'
            (else
             (cons (car sequence)
                   (flatten (cdr sequence))))))