复习 Lisp: Syntax and Semantics

我他妈的也被这样坑过, 我感觉lisp里面的许多概念都是这么来的: 一群了解 lisp 核心的大牛 从 lisp 的基本规则 推倒出一个有意思的东西, 大家都在研究这个东西, 那就给它起一个简单的 名字吧, 然后一个计算机术语就出现了, 他们之做了一个简单的命名.就好比他们见过外星人,写了 一个什么是外星人.

但我们学习这个东西的时候, 往往是从定义开始的, 难度就好比你没见过外星人, 单凭外星人的描述 来理解什么是外星人一样. 极度的坑爹

另外一个例子就是: 什么是 symbol , 我一开始的时候被这个问题困惑了很久, 根本不理解那些 文献或者教材里面的定义到底在说啥, 等我稍微了解了一下 lisp 的内部运行机制, 我发现这玩意 其实是一个非常简单的东西, 但让我说 symbol 是什么, 我只能说 符号就是符号,用就行了…

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 个赞

我估计初学者是最恨这种定义了, 单纯的描述, 就好比将斧头定义为一个木头把上面有一个铁块的物体…

这个嘛,需要稍微了解一下 C 和计算机原理,知道各种数据类型在内存中是如何表示的,指针是个啥玩意,大概就懂了。虽然 Lisp 是高度抽象的语言,但实现还是受到计算机结构限制的。

一开始学习的话,就只能用行为来推导了。

Symbol和Pointer是困扰我很多年的东西。现在稍微对Pointer有些认识了,但是Symbol还是停留在“能用,但是不知道是啥”的阶段

推荐读 《Low Level Programing》

这条不对吧。

1 个赞

嗯,我对 Lisp 的 variable catch 理解出了偏差。用 setq 设的变量不會被捕獲。

“变量捕捉“ 这个术语有时候很有误导性

(let ((x 1))
  (lambda () x))

以前我一直认为 “变量捕捉” 的意思是, 第一个 x 把第二个 x 给捉住了的意思。 后来看文献才发现, 似乎不是这么理解的, “变量捕捉“ 里面的变量是指 “自由变量“, 它是指第二个x, 第二个x被第一个x构建的笼子给限制住了,失去了原来自由性,所以就叫 “变量捕捉”。。。。

所以,我的结论是: 变量捕捉和变量赋值,其实是类似的, 唯一的不同可能就是: 变量赋值是直接赋值,而变量捕捉,是一种环境间接赋值法, 总归来说都是赋值操作。

进一步脑补: 既然变量赋值有直接赋值和间接赋值两种方式, 那创建变量是不是也应该有两种方式呢? :grimacing:

以前在这一块我也混乱过, 在 elisp 中, 存在两种独立的操作:

  1. 创建变量操作
  2. 变量赋值操作

创建变量操作最常见的有两种: 全局的变量创建用 defvar, 局部的变量创建用let,

而 setq 是变量赋值操作,

可是大家习惯直接用 setq 创建并赋值变量,虽然省事,但严格来讲,是不太合理的。

所以这句话这样说可能更好: 已经赋值的变量没有自由性,所以不会被环境捕获,只有自由变量才存在变量捕捉的问题。

另外一个问题是: 自由变量为什么一定要被捕捉? 其实很简单,因为 lisp 语法 规定了, 自由变量必须被求值,不被赋值,怎么被求值呢?

《Low Level Programing》 这本书作者是?或是有链接吗?我搜了下感觉没找到对应的书

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 个赞