Scheme 方案无效错误?

Scheme 方案无效错误?,scheme,racket,Scheme,Racket,我对scheme还不熟悉,我编写了一个小程序,根据开始和结束索引从列表中提取原子 (define counter 0) (define (sub x y a_list) (cond ((null? a_list) '()) ((and (>= counter x) (< counter y)) (cons x (sub x y (cdr a_list)))) (else((set! counter (+ counter 1)) (sub x y (cdr

我对scheme还不熟悉,我编写了一个小程序,根据开始和结束索引从列表中提取原子

(define counter 0)
(define (sub x y a_list) 
  (cond
    ((null? a_list) '())
    ((and (>= counter x) (< counter y)) (cons x (sub x y (cdr a_list))))
    (else((set! counter (+ counter 1)) (sub x y (cdr a_list))))
  ))
我得到以下错误:

function call: expected a function after the open parenthesis, but received (void)

我建议如下:

(define (sub x y lst)
  (let loop ((lst lst) (counter 0))
    (cond
      ((null? lst) 
       '())
      ((and (>= counter x) (< counter y)) 
       (cons (car lst) (loop (cdr lst) (+ 1 counter))))
      (else 
       (loop (cdr lst) (+ 1 counter))))))
关于你最初的问题:

  • 要在只允许一个表单的位置对表单进行分组(
    如果想到了
    ),请使用
    begin
    (有关详细信息,请参阅卓越球拍帮助)

  • ((fx…)y…
    首先计算
    (fx…
    ),它应该返回一个过程
    p
    ;然后计算
    (py…
    )。在您的情况下,
    f
    被设置为
    set,它的计算结果总是
    (void)
    ,因此它的计算结果是
    ((void)y…
    。因此出现了错误消息

  • 编辑

    在没有计数器的情况下说明@WorBlux的想法:

    (define (sub x y lst)
      (cond
        ((or (null? lst) (<= y 0))
         '())
        ((> x 0)
         (sub (- x 1) (- y 1) (cdr lst)))
        (else
         (cons (car lst) (sub (- x 1) (- y 1) (cdr lst))))))
    
    (定义(子x y lst)
    (续)
    
    ((或(null?lst)(我建议如下:

    (define (sub x y lst)
      (let loop ((lst lst) (counter 0))
        (cond
          ((null? lst) 
           '())
          ((and (>= counter x) (< counter y)) 
           (cons (car lst) (loop (cdr lst) (+ 1 counter))))
          (else 
           (loop (cdr lst) (+ 1 counter))))))
    
    关于你最初的问题:

  • 要在只允许一个表单的位置对表单进行分组(
    如果想到了
    ),请使用
    begin
    (有关详细信息,请参阅卓越球拍帮助)

  • ((fx…)y…
    首先计算
    (fx…
    ),它应该返回一个过程
    p
    ;然后它计算
    (py…
    。在您的例子中,
    f
    集!
    ,它的计算结果总是
    (void)
    ,因此这被计算为
    ((void)y…)
    。因此出现了错误消息

  • 编辑

    在没有计数器的情况下说明@WorBlux的想法:

    (define (sub x y lst)
      (cond
        ((or (null? lst) (<= y 0))
         '())
        ((> x 0)
         (sub (- x 1) (- y 1) (cdr lst)))
        (else
         (cons (car lst) (sub (- x 1) (- y 1) (cdr lst))))))
    
    (定义(子x y lst)
    (续)
    
    ((或(null?lst)(在这个问题中,实际上不需要计数器,只要再考虑一下递归的模式就可以了


    (sub x y L)等价于(sub(?x)(?y)(cdr L)),其中x大于零,并且等价于(?L)(sub x(?y)(cdr L)))其中x为0,但y为正,相当于y小于0的空列表。

    在这个问题中,实际上不需要计数器,只需再考虑一下递归的模式


    (sub x y L)等价于(sub(?x)(?y)(cdr L)),其中x大于零,并且等价于(?L)(sub x(?y)(cdr L)))其中x为0,y为正,相当于y小于0的空列表。

    集合周围加上双括号!
    ,但结果是错误的。它应该是双括号,否则我不能在其他语句中加上两个语句。你能重新编写else语句吗,因为我已经厌倦了许多与paren有关的事情论文之前和未为我工作可能会在你的
    集合周围重复双括号!
    ,但结果是错误的。它应该是双括号,因为否则我不能在其他语句中放入两个语句。你能重新编写else语句吗?因为我已经厌倦了使用括号之前和未为我工作的许多事情我已经厌倦了你重新编写的代码,但仍然产生相同的erorr,我正在使用dr.racet advance student,所以我不知道这是否是问题所在。我不得不用另一个括号将集合包装起来,因为否则它将无法编译。好的,修改。你真的应该在问题中说明你使用的语言。我厌倦了你的重新编写我使用dr.racet Advanced student,所以我不知道这是否是问题所在。我必须用另一个括号将集合括起来,因为否则它将无法编译。好的,修改。您真的应该在问题中说明您使用的语言。
    (define (sub x y lst)
      (cond
        ((or (null? lst) (<= y 0))
         '())
        ((> x 0)
         (sub (- x 1) (- y 1) (cdr lst)))
        (else
         (cons (car lst) (sub (- x 1) (- y 1) (cdr lst))))))