我他妈的也被这样坑过, 我感觉lisp里面的许多概念都是这么来的: 一群了解 lisp 核心的大牛
从 lisp 的基本规则 推倒出一个有意思的东西, 大家都在研究这个东西, 那就给它起一个简单的
名字吧, 然后一个计算机术语就出现了, 他们之做了一个简单的命名.就好比他们见过外星人,写了
一个什么是外星人.
但我们学习这个东西的时候, 往往是从定义开始的, 难度就好比你没见过外星人, 单凭外星人的描述
来理解什么是外星人一样. 极度的坑爹
另外一个例子就是: 什么是 symbol , 我一开始的时候被这个问题困惑了很久, 根本不理解那些
文献或者教材里面的定义到底在说啥, 等我稍微了解了一下 lisp 的内部运行机制, 我发现这玩意
其实是一个非常简单的东西, 但让我说 symbol 是什么, 我只能说 符号就是符号,用就行了…
LdBeth
2018 年1 月 14 日 04:29
22
A symbol is an object with a simple string representation that (by default) is guaranteed to be interned; i.e., any two symbols that are written the same are the same object in memory (reference equality).
1 个赞
我估计初学者是最恨这种定义了, 单纯的描述, 就好比将斧头定义为一个木头把上面有一个铁块的物体…
LdBeth
2018 年1 月 14 日 04:36
24
这个嘛,需要稍微了解一下 C 和计算机原理,知道各种数据类型在内存中是如何表示的,指针是个啥玩意,大概就懂了。虽然 Lisp 是高度抽象的语言,但实现还是受到计算机结构限制的。
一开始学习的话,就只能用行为来推导了。
Symbol和Pointer是困扰我很多年的东西。现在稍微对Pointer有些认识了,但是Symbol还是停留在“能用,但是不知道是啥”的阶段
LdBeth
2018 年1 月 14 日 05:52
26
推荐读 《Low Level Programing》
LdBeth
2018 年1 月 14 日 11:58
28
嗯,我对 Lisp 的 variable catch 理解出了偏差。用 setq
设的变量不會被捕獲。
“变量捕捉“ 这个术语有时候很有误导性
(let ((x 1))
(lambda () x))
以前我一直认为 “变量捕捉” 的意思是, 第一个 x 把第二个 x 给捉住了的意思。
后来看文献才发现, 似乎不是这么理解的, “变量捕捉“ 里面的变量是指 “自由变量“, 它是指第二个x, 第二个x被第一个x构建的笼子给限制住了,失去了原来自由性,所以就叫 “变量捕捉”。。。。
所以,我的结论是: 变量捕捉和变量赋值,其实是类似的, 唯一的不同可能就是: 变量赋值是直接赋值,而变量捕捉,是一种环境间接赋值法, 总归来说都是赋值操作。
进一步脑补: 既然变量赋值有直接赋值和间接赋值两种方式, 那创建变量是不是也应该有两种方式呢?
LdBeth:
用 setq 设的变量不會被捕獲。
以前在这一块我也混乱过, 在 elisp 中, 存在两种独立的操作:
创建变量操作
变量赋值操作
创建变量操作最常见的有两种: 全局的变量创建用 defvar, 局部的变量创建用let,
而 setq 是变量赋值操作,
可是大家习惯直接用 setq 创建并赋值变量,虽然省事,但严格来讲,是不太合理的。
所以这句话这样说可能更好: 已经赋值的变量没有自由性,所以不会被环境捕获,只有自由变量才存在变量捕捉的问题。
另外一个问题是: 自由变量为什么一定要被捕捉? 其实很简单,因为 lisp 语法
规定了, 自由变量必须被求值,不被赋值,怎么被求值呢?
LdBeth:
《Low Level Programing》
《Low Level Programing》 这本书作者是?或是有链接吗?我搜了下感觉没找到对应的书
LdBeth
2018 年1 月 18 日 09:07
33
Low-Level Programming: C, Assembly, and Program Execution on Intel® 64 Architecture
Igor Zhirkov
Saint Petersburg, Russia
ISBN-13 (pbk): 978-1-4842-2402-1
1 个赞