Scheme中命令的执行顺序

new*_*int 0 scheme

我正在编写一个程序中的程序,它使用递归遍历列表,并在计数器达到一定数量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)(无参数)"

Pau*_*aul 7

你把它括在括号中两次.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)