0

我正在通过 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))

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

任何帮助,将不胜感激!

编辑:

我刚刚尝试运行:

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

并得到同样的错误。

4

2 回答 2

2

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

相反,您需要使用的是(list x y z).

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

于 2014-12-05T05:46:15.623 回答
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)
于 2014-12-05T06:01:21.327 回答