【发布时间】:2016-09-14 01:32:12
【问题描述】:
我对 LISP 非常陌生,并且在使用操作数组时遇到了一些麻烦。上面的资源并不多,因为列表似乎被更广泛地使用。我有以下代码,我试图查看一个数组并返回出现最小值的位置(我不知道我的格式是否正确):
(defun FIND-MIN(x)
(setq ctr (aref x 0)) (setq pos 1) (setq finalpos 1)
(loop while (< pos (array-total-size x))
do
(
(if (< ctr (aref Z pos))
(progn
(setq ctr pos)
(setq finalpos pos))
(incf pos)
)
)
finalpos
)
我的理由是首先创建一些变量,ctr 默认设置为第一个位置并跟踪最小值,位置计数器 (pos) 用于跟踪我在数组中的位置,以及 finalpos变量来存储最小值出现的位置。然后我将循环直到 pos 到达数组的末尾。在每一步它都会检查元素是否小于 ctr 以及是否更新 ctr 和 finalpos 。然后增加 pos 以继续数组。每个元素检查完后程序会返回finalpos,应该是最小元素的位置。
我从中得到的错误是:
- SYSTEM::%EXPAND-FORM: (SETQ CTR (AREF X 0)) 应该是 lambda 表达式
我认为我不需要 lambda 表达式,因为 aref 只是获取单个值(第一个值),而提取单个值是 aref 的工作。另外请指出我的逻辑是否有缺陷,因为这种新语言与我以前使用的任何语言都非常不同。非常感谢任何和所有帮助!
【问题讨论】:
-
此外,典型样式不会在自己的行上留下尾括号。但这不会导致您看到的语法错误。
-
您正尝试将
(setq ctr (aref x 0))作为函数应用到参数(setq pos 1)、(setq finalpos 1)、(loop ...)和finalpos。您可能应该在附近的书中复习 Lisp 语法。 (我推荐Practical Common Lisp。) -
@molbdnilo 我删除了程序前后的额外括号,因为我意识到我正在做的额外包装。我编辑了我的原始帖子。那是你描述的错误吗?这确实有助于修复该特定位置的错误,但出现了一个新错误,要求像以前一样使用 lambda:SYSTEM::%EXPAND-FORM: (IF (
-
@TimStrayer 你将
(if (< ctr (aref Z pos)) (setq ctr pos)(setq finalpos pos))申请到(setq pos pos+1);您需要在do中对progn进行排序。您的下一个问题可能是 Lisp 没有中缀运算符,并且变量pos+1没有定义。但是网上也有不错的免费书籍,就像我提到的那本书。 -
@molbdnilo 进行了您建议的更改。 progn 现在遵循我的 if 语句,并且 pos 的增量现在是 (incf pos)。我编辑了我的原始帖子,以便在那里可以看到更改。仍然得到相同的错误: SYSTEM::%EXPAND-FORM: (IF (,我不确定如何修复这样的错误