应用:不是程序球拍

时间:2014-04-25 14:49:31

标签: conditional-statements racket

我是新手。我正在尝试从用户的输入创建一个列表,当值为0时,将打印前三个元素。

这是代码:

#lang racket
(define lst '())
(define (add)
   (define n(read))
   (if (= n 0)
      ;then
      (
        list (car lst) (cadr lst) (caddr lst) 
       )
      ;else
      (
        (set! lst (append lst (list n)))
        (add)
       )
     )
 )
(add)

我使用值1 2 3 4 5 0

测试了程序

但我一直收到这个错误:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:
   '(1 2 3)

任何人都可以帮我弄清楚出了什么问题。

3 个答案:

答案 0 :(得分:2)

如果&#34中有多个表达式,那么&#34;或&#34;否则&#34;部件,您必须将它们括在begin内,因为Scheme中的一对()用于功能应用程序 - 这解释了您获得的错误。试试这个:

(define (add)
   (define n (read))
   (if (= n 0)
      ; then
      (list (car lst) (cadr lst) (caddr lst))
      ; else
      (begin
        (set! lst (append lst (list n)))
        (add))))

答案 1 :(得分:0)

您的代码存在一些问题,例如,如果您输入少于3个元素,它将失败。此外,在模块级别定义变量不被认为是好的风格。

我建议如下:

(define (add)
  (define (sub cnt lst)
    (define n (read))
    (if (= n 0)
        (reverse lst)
        (if (< cnt 3)
            (sub (add1 cnt) (cons n lst))
            (sub cnt lst))))
  (sub 0 '()))

答案 2 :(得分:0)

我遇到了类似的问题,在一个函数中我调用了一个具有相同结构名称的参数,因此,尝试创建该结构的实例时,我得到了同样的错误。

示例:

> (struct example (param1 param2) #:transparent)
> (define e (example 1 2))
> e
(example 1 2)
> (define (fn e)
    (example (example-param1 e) 0))
> (fn e)
(example 1 0)
> (define (fn example)
    (example (example-param1 example) 0))
> (fn e)
application: not a procedure;
 expected a procedure that can be applied to arguments
  given: (example 1 2)
  arguments...: 

我希望这会有所帮助