Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

set vs setq in lisp

3 views
Skip to first unread message

婆婆大的

unread,
Feb 22, 2012, 12:00:38 PM2/22/12
to


求教,lisp里面的(set q p),如果q没有加'的话,会被继续求值

我有个问题,就是这里的q,如果已经被赋值过,比如q0,那么q0会被继续求值么?interpretor是如何停止这个递归求值行为的呢?

再有,对函数编程不熟悉,如果左值是函数的话,如何被赋值呢?一定是最后被求解出来的变量被赋值么?

谢谢
--

[m [35m※ 来源:·水木社区 http://newsmth.net·[FROM: 213.95.68.*] [m

format t A walker

unread,
Feb 22, 2012, 9:22:34 PM2/22/12
to

【 在 Schlafgern (婆婆大的) 的大作中提到: 】
: 标 题: set vs setq in lisp
: 发信站: 水木社区 (Thu Feb 23 01:00:37 2012), 转信
:
:
:
: 求教,lisp里面的(set q p),如果q没有加'的话,会被继续求值
:
: 我有个问题,就是这里的q,如果已经被赋值过,比如q0,那么q0会被继续求值么?interpretor是如何停止这个递归求值行为的呢?

对于function来说,是把每个参数(如果有的话)eval一次之后,传给这个function。

所以如果q是个symbol,而它的值是另一个symbol q0,那么

(set q p)

等价于把p的值(可以认为是(symbol-value 'p))assign给q所指向的值
(同样是(symbol-value 'q)),在这个问题中正好是一个symbol,也就是q0.

试下这段代码

(setq q 'q0)
(setq p "abcde")
q ;; => q0

(set q p)

q ;; => q0
q0;; => "abcde"


:
: 再有,对函数编程不熟悉,如果左值是函数的话,如何被赋值呢?一定是最后被求解出来的变量被赋值么?
:
: 谢谢
: --
:
[36m※ 修改:·Madsen 于 Feb 23 10:22:34 2012 修改本文·[FROM: 202.175.181.*] [m
: [m [35m※ 来源:·水木社区 http://newsmth.net·[FROM: 213.95.68.*] [m


--
充满幻想的女人们,赶紧幻灭白马王子的梦想吧,要不Age版就是你们的归属,圣女就是你们的封号。
如果期望老天会给你一个长的帅又有钱还体贴性能力还强的男人(所谓床下端庄床上淫荡),那么回想一下你们这些所谓的天使从天上掉下来时是不是脸着地或者身材被摔坏了甚至是脑子摔坏了。


[m [1;35m※ 来源:·水木社区 newsmth.net·[FROM: 202.175.181.*] [m

format t A walker

unread,
Feb 22, 2012, 9:30:16 PM2/22/12
to
第二个问题,如果充当“左值”的函数eval之后得到的是一个symbol,那么这个symbol
会被赋值。

比如

(set ((lambda () 'xxxyyy-symbol)) "test")

另外要注意elisp(或者说lisp里)的“变量”比C之类语言里的“变量”有
更多一些的内涵。(引自elisp 手册∶ A "variable" is a name used in
a program to stand for a value. In Lisp, each variable is
represented by a Lisp symbol)


【 在 Madsen (format t "A walker") 的大作中提到: 】
: 对于function来说,是把每个参数(如果有的话)eval一次之后,传给这个function。
: 所以如果q是个symbol,而它的值是另一个symbol q0,那么
: (set q p)
: ...................

--

* Notepad is easy to start using, and users gradually learn some tricks, but there's really not much to it.
* vi is impossible to even begin using without reading some documentation, so users have to learn a lot in a short amount of time.
* emacs is slightly more friendly at the outset, but quickly becomes fucking insane.
-- http://www.reddit.com/r/programming/comments/7qv5y/common_learning_curves_of_text_editors/

婆婆大的

unread,
Feb 23, 2012, 7:10:03 AM2/23/12
to
额,最后没看懂,lisp里面变量比普通编程语言多出来的含义,所谓lisp symbol有什么特殊含义么?,是说加括号能被解释成函数么?还是?

还有,如果是纯的函数式语言,没有变量的情况下,总有个东西来保存值吧,这时候函数的语义又是什么呢?

【 在 Madsen (format t "A walker") 的大作中提到: 】
: 第二个问题,如果充当“左值”的函数eval之后得到的是一个symbol,那么这个symbol
: 会被赋值。
: 比如
: ...................

--

[m [37m※ 来源:·水木社区 http://newsmth.net·[FROM: 213.95.68.*] [m

format t A walker

unread,
Feb 23, 2012, 9:55:10 PM2/23/12
to

【 在 Schlafgern (婆婆大的) 的大作中提到: 】
: 标 题: Re: set vs setq in lisp
: 发信站: 水木社区 (Thu Feb 23 20:10:02 2012), 转信
:
: 额,最后没看懂,lisp里面变量比普通编程语言多出来的含义,所谓lisp symbol有什么特殊含义么?,是说加括号能被解释成函数么?还是?
:
这个我不懂。搜了一下stackoverflow。虽然说的是CL,不过类似∶

http://stackoverflow.com/questions/7385430/are-variable-and-symbol-different-in-lisp

We are talking about different things in Common Lisp:

symbol : that's a data structure in Lisp. A symbol is a data object with a name, a value, a function, a package and possibly more.
In Common Lisp the symbol can have both a value and a function (or macro).

a variable is an identifier for a value in Lisp code

: 还有,如果是纯的函数式语言,没有变量的情况下,总有个东西来保存值吧,这时候函数的语义又是什么呢?
:

嗯,“总有个东西来保存值”是核心所在。不精确地说,变量可以认为只是一个
内存位置的标识;函数的语义可以认为是有指令序列和对内存的操作组成。

: 【 在 Madsen (format t "A walker") 的大作中提到: 】
: : 第二个问题,如果充当“左值”的函数eval之后得到的是一个symbol,那么这个symbol
: : 会被赋值。
: : 比如
: : ...................
:
: --
:
: [m [37m※ 来源:·水木社区 http://newsmth.net·[FROM: 213.95.68.*] [m


--

左VS,右Office,Windows在腰间,鼠标挂胯下,人挡杀人,佛挡杀佛。


[m [1;36m※ 来源:·水木社区 newsmth.net·[FROM: 202.175.181.*] [m
0 new messages