Scheme中命令的执行顺序

发布于 2024-09-28 16:04:38 字数 413 浏览 2 评论 0原文

我正在方案中编写一个程序,它使用递归来遍历列表,并在计数器达到某个数字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]))

我不明白,为什么从底部开始的第二行给我带来麻烦:错误我得到的是“程序应用程序:预期程序,给定:'(1)(无参数)”

I am writing a program in scheme, that uses recursion to walk through the list, and stop at certain pointer, when counter reaches a certain number 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]))

I don't understand, why the second line from the bottom is giving me trouble: the error I am getting is "procedure application: expected procedure, given: '(1) (no arguments)"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清晰传感 2024-10-05 16:04:38

您将其括在括号中两次。 Scheme 中的表达式的格式为 (func-expr arg-expr ...),因此第一个表达式必须计算为函数。因此,如果您这样做:

(define (f n) n)
((f 5))

它将评估 (f 5) 然后它会尝试评估 (5) 这是一个错误。

编辑:一些说明。

您将以下内容括在括号中两次:

((set! counter (+ counter 1))(cons (first lst) (functX N (rest lst)))))

因此首先它计算 set! 并减少到(其中 n 是一个数字):

(n (cons ...))

cons 是然后与其参数一起求值(其中 x 是结果):

(n x)

然后它尝试将参数 x 应用于函数 n,但由于n 是一个会导致错误的数字。如果您想进行两次单独的计算并且只返回一个值,则可以使用 begin

(begin (set! counter (+ counter 1)) (cons (first lst) (functX N (rest lst))))

更新:

这是一个函数,它似乎可以在没有巫毒的情况下做你想做的事情(因为突变是邪恶的)。

(define (take n xs)
  (cond
    [(empty? xs) empty]
    [(negative? n) empty]
    [(eq? n 0) empty]
    [else (cons (first xs) (take (- n 1) (rest xs)))]))

You have it enclosed in parentheses twice. Expressions in Scheme have the form (func-expr arg-expr ...), so the first expression must evaluate into a function. So if you did:

(define (f n) n)
((f 5))

It would evaluate (f 5) then it would try and evaluate (5) which is an error.

Edit: Some clarification.

You have the following enclosed in brackets twice:

((set! counter (+ counter 1))(cons (first lst) (functX N (rest lst)))))

So first it evaluates set! and reduces down to (where n is a number):

(n (cons ...))

cons is then evaluated along with its arguments (where x is the result):

(n x)

It then tries to apply the argument x to the function n, but since n is a number this results in an error. If you wanted to do two separate computations and only return the value of one, you can use begin.

(begin (set! counter (+ counter 1)) (cons (first lst) (functX N (rest lst))))

Update:

Here is a function that appears to do what you want without voodoo (since mutation is evil).

(define (take n xs)
  (cond
    [(empty? xs) empty]
    [(negative? n) empty]
    [(eq? n 0) empty]
    [else (cons (first xs) (take (- n 1) (rest xs)))]))
遇到 2024-10-05 16:04:38

您应该考虑在递归调用中递减 N 并完全删除 counter 变量。

You should consider decrementing N in the recursive call and removing the counter variable altogether.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文