我正在编写一个程序中的程序,它使用递归遍历列表,并在计数器达到一定数量N时停在某个指针处
(define (functX N lst)
(define counter 1)
(cond
[(empty? lst) empty]
[(negative? N) empty]
[(< (length lst) N) empty]
[(<= counter N) ((set! counter (+ counter 1))(cons (first lst) (functX N (rest lst)))))]
[else empty]))
Run Code Online (Sandbox Code Playgroud)
我不明白,为什么从底部的第二行给我带来麻烦:我得到的错误是"程序应用程序:预期程序,给定:'(1)(无参数)"
你把它括在括号中两次.Scheme中的表达式具有表单(func-expr arg-expr ...),因此第一个表达式必须求值为函数.所以,如果你这样做:
(define (f n) n)
((f 5))
Run Code Online (Sandbox Code Playgroud)
它会评估(f 5)它会尝试并评估(5)哪个是错误.
编辑:一些澄清.
您将括号括在括号中两次:
((set! counter (+ counter 1))(cons (first lst) (functX N (rest lst)))))
Run Code Online (Sandbox Code Playgroud)
所以首先它评估set!并减少到(在哪里n是一个数字):
(n (cons ...))
Run Code Online (Sandbox Code Playgroud)
cons然后评估它的参数(x结果在哪里):
(n x)
Run Code Online (Sandbox Code Playgroud)
然后它尝试将该参数x应用于该函数n,但由于这n是一个数字,这会导致错误.如果您想要进行两次单独的计算并且仅返回值1,则可以使用begin.
(begin (set! counter (+ counter 1)) (cons (first lst) (functX N (rest lst))))
Run Code Online (Sandbox Code Playgroud)
更新:
这是一个看起来没有伏都教你想要的功能(因为变异是邪恶的).
(define (take n xs)
(cond
[(empty? xs) empty]
[(negative? n) empty]
[(eq? n 0) empty]
[else (cons (first xs) (take (- n 1) (rest xs)))]))
Run Code Online (Sandbox Code Playgroud)