--
Lisp-cn(Lisp中文用户组)
CLUG http://lisp.org.cn
我原来给的结果不对,实际结果是这样的
(defun my-pop (a)
(pop a));my-pop无法正常运行
(defun test ()
(let ((a '(1 2)) (b '(1)) (c '(1 2)) (d '(1)))
(pop a)
(print a);(2) ok
(pop b)
(print b);nil ok
(my-pop c)
(print c);(1 2) pop 失败,情况统一,应该不是bug
(my-pop d)
(print d);(1) pop 失败 ,情况统一,应该不是bug
)
)
我分析原因,你大概用了smile,其实是common lisp,pop使用了setf,所以会影响外部,而emasc lisp里是setq,影响
不到外部--
我原来的实际例子是这样的
(defun remove-last (heap)
(if (null heap)
nil
(let ((temp (nreverse heap)))
(prog1 (pop temp)
(nreverse temp)))))
(defun test ()
(let ((a '(1 2)) (b '(1)) (c '(1 2)) (d '(1)))
(pop a)
(print a);(2) ok
(pop b)
(print b);nil ok
(remove-last c)
(print c);(1) remove-last成功
(remove-last d)
(print d);(1) remove-last失败
)
)
这就不奇怪了,长度为1时,pop以后变成nil了,nreverse失效了,所以出bug了
不过奇怪的事情又出现了,本来影响不到外部的pop,因为nreverse又能影响外部了
On Mar 5, 3:08 pm, 刘滔 <mat.liu...@gmail.com> wrote:
> 真奇怪,我在自己的Emacs上运行了test函数后,(print d)确实是打印了nil到minibuffer中的。
>
> 在 2012年3月5日 下午2:27,池塘仙人 <yourname1...@gmail.com>写道:
>
>
>
>
>
>
>
>
>
> > (defun my-pop (a)
> > (pop a));my-pop无法正常运行
> > (defun test ()
> > (let ((a '(1 2)) (b '(1)) (c '(1 2)) (d '(1)))
> > (pop a)
> > (print a);(2) ok
> > (pop b)
> > (print b);nil ok
> > (my-pop c)
> > (print c);(2) ok
> > (my-pop d)
> > (print d);(1) pop 失败
> > )
> > )
> > setcar、setcdr之类的就不会有这样的问题,囧
>
> > --
> > Lisp-cn(Lisp中文用户组)
> > CLUGhttp://lisp.org.cn
>
> --
> Liutos Love Linux LaTeX Lisp Ling
>
> 我的博客,纪念我死去的GAE <http://blog.sina.com.cn/u/2031941547>
On Mar 5, 7:54 pm, 刘滔 <mat.liu...@gmail.com> wrote:
> 呃,我真的是在Emacs里面用Elisp尝试的,真的没有用SLIME,也不是Common Lisp......
>
> 不过我也犯了一个错误,我之前尝试的那个test函数里面的pop用的是pop而不是my-pop,现在尝试了my-pop的版本,minibuffer的打印 结果为
>
> (2)
>
> nil
>
> (1 2)
>
> (1)
>
> 确实,作为在函数里面的pop是影响不到外面的,就算是在Common
> Lisp里面也不能改变外面的值,因为作为参数传进去的那个已经只是一个值了,而不是符号,pop在宏展开的时候已经找不到那个符号了,自然无法改变那个值。
>
On Mar 5, 9:54 pm, 刘滔 <mat.liu...@gmail.com> wrote:
> 我只在Common
> Lisp里面用过nreverse函数。我觉得这个东西是不能用定义函数来实现的,因为这个函数有副作用,它会真真正正地改变传递给它的参数,类似的还有del ete函数,返回值和remove一样,只是它的效果是in
> place的,也就是作为参数传递的值会被修改,就是有side effect,副作用。
>
关于wuhen说的参数未绑定问题,我不太确定是什么情况。请问你是怎么测试的啊。
-- Function: symbol-value symbol
This function returns the value of SYMBOL. This is the value in
the innermost local binding of the symbol, or its global value if
it has no local bindings.
(setq abracadabra 5)
=> 5
(setq foo 9)
=> 9
;; Here the symbol `abracadabra'
;; is the symbol whose value is examined.
(let ((abracadabra 'foo))
(symbol-value 'abracadabra))
=> foo
;; Here, the value of `abracadabra',
;; which is `foo',
;; is the symbol whose value is examined.
(let ((abracadabra 'foo))
(symbol-value abracadabra))
=> 9
(symbol-value 'abracadabra)
=> 5