(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]?这是什么意思?
请了解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形式.除非你已经创建了一个绑定的contor和counter所显示的代码之外,此代码未定义的行为("任何可能发生"). 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,contor和counter.
上一个错误:e未在显示的代码中绑定.我不知道你想在这里做什么,但我认为你只是想z在你努力创造它之后回来.因为你遍历l和push成z,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.我想纠正这个是你的下一步努力.