在推杆中推错误

Mat*_*att 1 lisp

(defun remov(l)
  (defparameter z ())
  (setq contor 0)
  (setq counter 0)
  (dolist (elem l) 
    (if
        (or (< (expt 2 contor) counter) (> (expt 2 contor) counter)) 
        ((push elem z) (setq contor (+ 1 contor))) (setq counter (+ 1 counter)))
    )


  (print e)
  )
Run Code Online (Sandbox Code Playgroud)

我为什么要这样Error: Illegal function object: (PUSH ELEM Z). [condition type: TYPE-ERROR]?这是什么意思?

Sva*_*nte 5

请了解Lisp中如何使用缩进和空格,以及换行有用的地方和不行的地方.

(defun remov (l)
  (defparameter z ())
  (setq contor 0)
  (setq counter 0)
  (dolist (elem l) 
    (if (or (< (expt 2 contor) counter)
            (> (expt 2 contor) counter))
        ((push elem z) (setq contor (+ 1 contor)))
        (setq counter (+ 1 counter))))
  (print e))
Run Code Online (Sandbox Code Playgroud)

直接问题:if接受三个参数,评估第一个参数,然后计算并返回第二个或第三个参数.第二种形式是:

((push elem z) (setq contor (+ 1 contor)))
Run Code Online (Sandbox Code Playgroud)

求值表单的第一个元素是运算符,它可以是函数或特殊运算符的名称,也可以是lambda表达式.lambda表达式就是这样的形式(lambda (x) ...).在这里,(push elem z)不符合该描述.这就是你得到的错误.

你的意图似乎是一个接一个地做两件事.这通常以progn表格形式完成.

(progn
  (push elem z)
  (setq contor (+ 1 contor)))
Run Code Online (Sandbox Code Playgroud)

这会产生:

(defun remov (l)
  (defparameter z ())
  (setq contor 0)
  (setq counter 0)
  (dolist (elem l) 
    (if (or (< (expt 2 contor) counter)
            (> (expt 2 contor) counter))
        (progn
          (push elem z)
          (setq contor (+ 1 contor)))
        (setq counter (+ 1 counter))))
  (print e))
Run Code Online (Sandbox Code Playgroud)

现在,那defparameter.这是z一个全局特殊的变量.至少调用一次此函数后,在整个程序中的任何位置z都会有特殊功能.那不是你想要的.看来你只想建立一个新的本地绑定.使用let了点.

(defun remov (l)
  (let ((z ()))
    (setq contor 0)
    (setq counter 0)
    (dolist (elem l) 
      (if (or (< (expt 2 contor) counter)
              (> (expt 2 contor) counter))
          (progn
            (push elem z)
            (setq contor (+ 1 contor)))
          (setq counter (+ 1 counter))))
    (print e)))
Run Code Online (Sandbox Code Playgroud)

然后,你有两种setq形式.除非你已经创建了一个绑定的contorcounter所显示的代码之外,此代码未定义的行为("任何可能发生"). Setq没有建立新的绑定.看起来你只想建立新的本地绑定,就像用它一样z.使用let表格.

(defun remov (l)
  (let ((z ())
        (contor 0)
        (counter 0))
    (dolist (elem l) 
      (if (or (< (expt 2 contor) counter)
              (> (expt 2 contor) counter))
          (progn
            (push elem z)
            (setq contor (+ 1 contor)))
          (setq counter (+ 1 counter))))
    (print e)))
Run Code Online (Sandbox Code Playgroud)

现在let建立本地绑定z,contorcounter.

上一个错误:e未在显示的代码中绑定.我不知道你想在这里做什么,但我认为你只是想z在你努力创造它之后回来.因为你遍历lpushz,z具有相比于相应的值相反的顺序l.如果你想拥有相同的订单,那么成语就是nreverse在最后使用.函数返回最后一个表单的值.

(defun remov (l)
  (let ((z ())
        (contor 0)
        (counter 0))
    (dolist (elem l) 
      (if (or (< (expt 2 contor) counter)
              (> (expt 2 contor) counter))
          (progn
            (push elem z)
            (setq contor (+ 1 contor)))
          (setq counter (+ 1 counter))))
    (nreverse z)))
Run Code Online (Sandbox Code Playgroud)

现在,让我们简化一下.要将setq变量1+赋值,请使用宏incf. (Incf foo)扩展到类似的东西(setq foo (1+ foo)).

(defun remov (l)
  (let ((z ())
        (contor 0)
        (counter 0))
    (dolist (elem l) 
      (if (or (< (expt 2 contor) counter)
              (> (expt 2 contor) counter))
          (progn
            (push elem z)
            (incf contor))
          (incf counter)))
    (nreverse z)))
Run Code Online (Sandbox Code Playgroud)

如果一个整数a或者是><不是的东西,它是/=.

(defun remov (l)
  (let ((z ())
        (contor 0)
        (counter 0))
    (dolist (elem l) 
      (if (/= (expt 2 contor) counter)
          (progn
            (push elem z)
            (incf contor))
          (incf counter)))
    (nreverse z)))
Run Code Online (Sandbox Code Playgroud)

我倾向于避免使用名称缩写.

(defun remove-when-foo (list)
  (let ((result ())
        (contor 0)
        (counter 0))
    (dolist (element list) 
      (if (/= (expt 2 contor) counter)
          (progn
            (push element result)
            (incf contor))
          (incf counter)))
    (nreverse z)))
Run Code Online (Sandbox Code Playgroud)

我对这个逻辑感到有些惊讶,因为if在这个循环中表单的条件总是正确的.这就是我命名的原因remove-when-foo.我想纠正这个是你的下一步努力.