Chinaunix

标题: 今天也看了一段,lisp之根源,有个问题? [打印本页]

作者: xdshting    时间: 2008-12-08 21:05
标题: 今天也看了一段,lisp之根源,有个问题?
反之一个被引用的表仅被视为表, 在此例中就是有两个元素的表:



> (atom '(atom 'a))
    ()

这里的意思是说,把`(atom)`当作一个token看待

但在下面的一个实例中

> ((lambda (f) (f '(b c)))
'(lambda (x) (cons 'a x)))
(a b c)

系统为什么不把红色的部分当作一个整体?
而是把整个的二行传给f
谢谢
作者: win_hate    时间: 2008-12-08 21:38
>> 这里的意思是说,把`(atom)`当作一个token看待

应该是把 `(atom `a) 当作一个表,所以 (atom `(atom `a)) 的结果才是 () 也就是 NIL

另一个我跑你的代码出错。你用的什么环境?

'(lambda (x) (cons 'a x)) 是一个被 quote 的表。

我用 clisp,只会用 funcall 调用函数


  1. [1]> ((lambda (f) (funcall f '(b c)))
  2. (lambda (x) (cons 'a x)))
  3. (A B C)
  4. [2]>
复制代码

[ 本帖最后由 win_hate 于 2008-12-8 21:41 编辑 ]
作者: xdshting    时间: 2008-12-08 22:45
原帖由 win_hate 于 2008-12-8 21:38 发表
>> 这里的意思是说,把`(atom)`当作一个token看待

应该是把 `(atom `a) 当作一个表,所以 (atom `(atom `a)) 的结果才是 () 也就是 NIL

另一个我跑你的代码出错。你用的什么环境?

'(lambda (x) (co ...


先谢谢斑竹

1,这个例子我没运行,在论坛看了一些帖子,感觉挺有意思,所以,我今天第一次看lisp,看得实the roots of lisp
> ((lambda (f) (f '(b c)))
'(lambda (x) (cons 'a x)))
(a b c)
这段代码,是在the roots of lisp中拷贝下来的

2,在请教一下,另一个问题,以您刚才测试程序为例

[1]> ((lambda (f) (funcall f '(b c)))
(lambda (x) (cons 'a x)))
(A B C)
[2]>

the roots of lisp中说,对((lambda (p1 p2 ......pn)e)a1,a2......an)来说,先求ai的值,
在这个例子中来说,就是先求(lambda (x) (cons 'a x))的值,这个知怎么求阿?
我是把f替换成(lambda (x) (cons 'a x))来理解的,可是不明白为什么

3,`(atom `a) 当作一个表
请您说一下表的定义

在次谢谢你

[ 本帖最后由 xdshting 于 2008-12-8 22:47 编辑 ]
作者: chenzengjie    时间: 2008-12-08 23:47
我的理解

列表的定义是这样:列表要么是个nil; 要么是个pair, 这个pair的cdr是列表.
pair是什么? 一对指针. 前面的指向一个对象,叫这个pair的car;后面的指向一个对象, 叫这个pair的cdr.

一个car是符号lambda的列表很特殊. 它代表一个函数. 记住在lisp里函数也是对象, 象数据一样被处理.
分析一下你的例子:
((lambda (f) (funcall f '(b c)))
(lambda (x) (cons 'a x)))

(lambda (f)
              (funcall f '(b c)))
这是个函数, 有一个参数f. 它所做就是用'(b c) 来调用(funcall)参数f. 由此看来参数f要求是一个函数对象.
再看你例子中这个表达式的其它部分: (lambda (x) (cons 'a x))
这定义了一个函数对蟓. 此函数只有一个参数. 所做就是在参数x前加了个'a构建了(cons)一个pair.

多思考思考.
作者: win_hate    时间: 2008-12-09 00:10
我猜那个文章用的是 arc,就是作者自己的 lisp 方言。

>> 2,在请教一下,另一个问题,以您刚才测试程序为例

>> [1]> ((lambda (f) (funcall f '(b c)))
>> (lambda (x) (cons 'a x)))
>> (A B C)
>> [2]>

>> the roots of lisp中说,对((lambda (p1 p2 ......pn)e)a1,a2......an)来说,先求ai的值,
>> 在这个例子中来说,就是先求(lambda (x) (cons 'a x))的值,这个知怎么求阿?
>> 我是把f替换成(lambda (x) (cons 'a x))来理解的,可是不明白为什么

对 (lambda (x) (cons 'a x)) 求值就得到了一个匿名函数。


>> 3,`(atom `a) 当作一个表
>> 请您说一下表的定义

列表是递归定义的

NIL 是列表

如果 L 是列表,则 (cons foo L) 也是列表。

列表也可以用 List 函数生成。

我用 gcl 试了一下,下面两个代码都是可以的


  1. ((lambda (f) (funcall f '(b c)))
  2. '(lambda (x) (cons 'a x)))

  3. ((lambda (f) (funcall f '(b c)))
  4. (lambda (x) (cons 'a x)))
复制代码


但在 clisp 和 elisp 中就只支持后者。看来是不同版本的 funcall 定义不同。

[ 本帖最后由 win_hate 于 2008-12-9 00:16 编辑 ]
作者: win_hate    时间: 2008-12-09 00:17
lisp 中的列表跟 scheme 中的不同。可以参考下面的连接:

http://bbs.chinaunix.net/thread-1275170-1-3.html
作者: 我是害虫    时间: 2008-12-09 10:53
谢谢win_hate版主的回答

也谢谢chenzengjie

我继续看书

xdshting就是我,不好意思,马甲拆穿了

另外想问一个问题:在fc9中是不是自带了clisp
[root@localhost ~]# locate clisp
/usr/share/a2ps/sheets/clisp.ssh
/usr/share/swig/1.3.33/clisp
/usr/share/swig/1.3.33/clisp/clisp.swg

这是我机器的输出,怎么用阿,还是要自己去下载一个?

[ 本帖最后由 我是害虫 于 2008-12-9 11:17 编辑 ]
作者: win_hate    时间: 2008-12-09 12:11
redhat 系的好久没用了。应该能用 rpm 之类的在线安装吧。
作者: MMMIX    时间: 2008-12-09 18:22
原帖由 win_hate 于 2008-12-9 12:11 发表
redhat 系的好久没用了。应该能用 rpm 之类的在线安装吧。

是 yum
作者: 温柔的小丑    时间: 2008-12-17 20:31





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2