今天也看了一段,lisp之根源,有个问题?

发布于 2022-08-17 19:39:07 字数 345 浏览 18 评论 9

反之一个被引用的表仅被视为表, 在此例中就是有两个元素的表:

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

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

但在下面的一个实例中

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

牛↙奶布丁 2022-08-19 10:35:05

原帖由 win_hate 于 2008-12-9 12:11 发表
redhat 系的好久没用了。应该能用 rpm 之类的在线安装吧。

是 yum

森罗 2022-08-19 10:34:30

redhat 系的好久没用了。应该能用 rpm 之类的在线安装吧。

烟花肆意 2022-08-19 10:02:22

谢谢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 编辑 ]

旧情别恋 2022-08-19 09:39:42

lisp 中的列表跟 scheme 中的不同。可以参考下面的连接:

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

怪我鬧 2022-08-19 05:30:17

我猜那个文章用的是 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 编辑 ]

放低过去 2022-08-19 02:20:42

我的理解

列表的定义是这样:列表要么是个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.

多思考思考.

北城孤痞 2022-08-18 16:11:48

原帖由 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 编辑 ]

软糖 2022-08-18 05:00:59

>> 这里的意思是说,把`(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 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文