我正在尝试使用lisp创建score function
。我的想法是我有一个列表作为输入。必须对此列表进行排序,并且每个值都应得到一个标记(最火的标记具有最高标记)
我尝试了类似普通排序的东西,但我需要使用lambda运算符
但是我的口齿不好。
说明一个例子: ((o1 10 15 20)(o2 5 14 20)(o3 7 8 8) 输出> ((o1 1 1 1)(o2 3 2 1)(o3 2 3 3))
它首先从o2排序o1的最火值,然后从o3排序,然后对它们进行排序。
答案 0 :(得分:0)
我实际上无法理解你的问题。但如果问题是:“帮我按常见的lisp排序列表”,那么:
1)`(setq o1(20 30 15))是一个有效的lisp表达式,(20 30 15)是一个列表,但它没有引用,因此解释器将尝试计算表达式。而评估规则是“表达式中的第一个元素是一个函数”,因此解释器将尝试评估名称为“20”且将失败的函数。你应该这样写:
(setq o1 '(20 30 15))
1')通常最好使用setf
而不是setq
(特别是如果你不想知道差异)。并且在为其设置值之前定义变量也更好。所以写这样的东西会更好:
(defparameter o1 '()) ;creating o1 with empty list
(setf o1 '(20 30 15))
1'')您应该使用可理解的名称命名变量和函数。如果是全局变量,则用星号标记。例如
(defparameter *students-scores* '())
(setf *students-scores* '(20 30 15))
2)通常,lisp list
是一个内置函数,可以根据它的参数创建一个列表。即使您在执行此代码时处于自己的程序包中(默认程序包已锁定,因此您无法在其中重新定义list
函数),重新定义此类函数({ {1}},因此请为您的功能选择其他名称
list
3)您的代码中的括号不匹配。