【问题标题】:How to use arrays in LISP - Finding the minimum value [duplicate]如何在 LISP 中使用数组 - 找到最小值 [重复]
【发布时间】: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 (&lt; 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 (,我不确定如何修复这样的错误

标签: arrays lisp


【解决方案1】:

您的defun 表单中有语法错误。具体来说,您已经将 defun 的主体包裹在一组括号中。这是不正确的。 defun 的形式是:

(defun NAME (ARGS) [DOCUMENTATION] BODY)

(CLHS 参考)。

身体将是一系列的形式;您已经将这一系列表格放在括号中,这会使编译器/解释器感到困惑。

(在我们有语法正确的代码之前,我不会评论风格。)

【讨论】:

  • 当我意识到我正在做的额外包装时,我删除了程序前后的额外括号。我编辑了我的原始帖子。那是你描述的错误吗?这确实有助于修复该特定位置的错误,但出现了一个新错误,要求像以前一样使用 lambda: SYSTEM::%EXPAND-FORM: (IF (
  • 同样的问题;但现在在loopdo 子句中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2021-12-27
相关资源
最近更新 更多