免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4614 | 回复: 9
打印 上一主题 下一主题

今天也看了一段,lisp之根源,有个问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-08 21:05 |只看该作者 |倒序浏览
反之一个被引用的表仅被视为表, 在此例中就是有两个元素的表:



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

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

但在下面的一个实例中

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

系统为什么不把红色的部分当作一个整体?
而是把整个的二行传给f
谢谢

论坛徽章:
0
2 [报告]
发表于 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 编辑 ]

论坛徽章:
0
3 [报告]
发表于 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 编辑 ]

论坛徽章:
0
4 [报告]
发表于 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.

多思考思考.

论坛徽章:
0
5 [报告]
发表于 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 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-12-09 00:17 |只看该作者
lisp 中的列表跟 scheme 中的不同。可以参考下面的连接:

http://bbs.chinaunix.net/thread-1275170-1-3.html

论坛徽章:
0
7 [报告]
发表于 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 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-12-09 12:11 |只看该作者
redhat 系的好久没用了。应该能用 rpm 之类的在线安装吧。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2008-12-09 18:22 |只看该作者
原帖由 win_hate 于 2008-12-9 12:11 发表
redhat 系的好久没用了。应该能用 rpm 之类的在线安装吧。

是 yum

论坛徽章:
0
10 [报告]
发表于 2008-12-17 20:31 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP