排序函数的包装程序因参数而失败

时间:2014-12-05 04:54:55

标签: scheme lisp sicp mit-scheme

我正在通过SICP工作,并且我需要在其中一个练习中创建列表中3个较大数字中的2个的列表。我试图使用sort函数,但是当我在函数中使用它时,我收到错误:

The object z, passed as the first argument to integer-less?, is not the correct type.

功能是:

(define (myList x y z) 
    (drop (sort '(x y z) <) 1))

如果我在解释器中运行第二行(将变量替换为实际值),它可以正常工作,但是当我尝试使用该函数时,它会爆炸。我是计划/ lisps的新手,所以我对列表的工作方式并不熟悉,但我猜它与此有关。我知道lisp使用链接列表,所以我想知道它是否与它到达最后一个元素并且不知道在那之后该怎么做。

任何帮助将不胜感激!

编辑:

我刚尝试跑步:

(define x 4)
(define y 10)
(define z 2)
(drop (sort '(x y z) <) 1)

并得到了同样的错误。

2 个答案:

答案 0 :(得分:2)

'(x y z)是一个包含三个符号xyz的列表。它与(list 'x 'y 'z)相同。

您需要使用的是(list x y z)

使用'(4 10 2)(例如)的原因是数字是“自我评估”。这意味着(list '4 '10 '2)(list 4 10 2)相同。

答案 1 :(得分:1)

除了@Chris的解释之外,这里有一种更简单的方法可用于任意数量的参数:

(define (myList . lst)  
  (drop (sort lst <) 1))

测试:

> (myList 10 1 5)
'(5 10)
> (myList 10 1 5 8)
'(5 8 10)
> (myList 10 1 5 8 -1)
'(1 5 8 10)