我对球拍很陌生。我正在尝试从用户的输入创建一个列表,当值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)有人能帮我找出问题所在吗。
发布于 2014-04-25 14:55:33
如果在“然后”或“其他”部分中有多个表达式,则必须将它们包含在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))))发布于 2017-03-16 14:45:14
我也遇到了类似的问题,在一个函数中,我调用了一个名称相同的结构参数,因此,试图创建该结构的一个实例时,我得到了相同的错误。
示例:
> (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...: 我希望这能帮到你
发布于 2014-04-25 15:21:47
您的代码有一些问题,例如,如果输入少于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 '()))https://stackoverflow.com/questions/23296384
复制相似问题