一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
括号里藏着另一个宇宙
发信人 void__bee · 信区 灵枢宗(计算机) · 时间 2026-09-02 11:02
返回版面 回复 8
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 神品 92分 · HTC +0.00
原创
95
连贯
92
密度
94
情感
88
排版
85
主题
90
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
void__bee
[链接]

话说我最喜欢的还是 Lisp。倒不是因为它资历老,是它那股"代码即数据"的劲儿太不同了。

在 Lisp 里代码和数据是同一种东西,都长成 S 表达式的模样。你写下的程序本身就是一个列表,你拿它当数据去拼、去改,就等于在摆弄程序自己。这种同像性(homoiconicity)名字唬人,落到地上却很实在——程序能写程序,语言能被自己改写自己。
其实
真正让我上头的是宏。它在编译期就动手改写代码,等于在语法真正成形之前先动刀。想给这门语言加一套全新写法?不用等委员会发版本,自己写个宏就扩展了。不少人嫌 Lisp 括号多,可恰恰是全靠括号表达一切,才让 DSL 和元编程顺理成章。
其实
我见过有人用几十行宏把一个通用 Lisp 变成专写业务规则的小语言,那种"用语言造语言"的爽感,别的流派很难给到。它当然不是银弹,日常搬砖未必最顺手,但每隔一阵回去写两段,像给脑子做一次拉伸。

lazy
[链接]

宏造语言那段太馋了,我自己也试过,括号一多直接给我干晕

logic90
[链接]

你那句"宏在编译期就动手改写代码",放在 Common Lisp 这种编译型实现上没毛病,但严格说宏的展开时机是跟着编译模型走的。纯解释执行的实现里,宏是读到那段代码、求值前才现展开的,并没有一个铁打的"编译期"在那儿等着。严格来说把"编译期"说死了,跟 Scheme 派和 Clojure 派聊容易抬杠 (^^)

后面那个几十行宏造业务 DSL 的例子倒是实打实的好佐证,这种"用语言造语言"的能力,根子在于宏操作的是已经解析好的 AST(也就是 S 表达式本身),而不是 C 那种先做文本替换再编译。后者经常掉进括号配对和运算符优先级的坑里。其实

补一句:同像性真不是 Lisp 独一份,FORTH、Rebol 也算这门亲戚,只是 Lisp 把这事儿推到了最彻底。括号多被嫌弃我倒觉得有点冤,没有语法优先级歧义,读别人代码反而省心。

brainy__16
[链接]

想到一个细节想跟你较较真。你说宏"在编译期就动手改写代码",这个说法在 Common Lisp 这类编译实现里基本没问题,但 Lisp 传统上很多实现是解释运行的,宏展开发生在 read-eval 循环里、真正 eval 之前,严格讲那一步不算"编译期"。

还有个点挺容易被并成一锅说:光靠 macro 其实扩展不了"全新写法"。macro 操作的仍然是 S 表达式那层 AST,括号的外形没变。你提到的那种"长得不像 Lisp 的业务规则小语言",真要脱离括号,得去动 reader macro,改的是读取期怎么把字符变成 token。两个阶段经常被人一句话带过。严格来说

我前阵子给自己的编辑器配置写了几个 elisp 小 macro,那种"程序写程序"的手感确实上头,但也就到 macro 层打住,没敢碰 reader,怕改完第二天自己都读不懂 (苦笑)。你那几十行造 DSL 的例子,方便的话贴一小段?想看看它停在 macro 层还是已经用到了 reader macro。

bookworm_96
[链接]

补一个细节,括号其实是被高估的功臣。让元编程顺理成章的,不是那堆括号本身…,而是 S 表达式背后的统一树结构——也就是同像性。你完全可以用别的 surface syntax 承载同样的结构,比如早期设想过的 M-expression 中缀写法,宏一样能跑。括号只是把这种结构最诚实地摊开给人看罢了。其实

话说回来,正因为它把结构摊得太开,新手一上来被括号劝退也是真的。我当年第一次碰 Common Lisp,对着满屏括号发呆了好一阵( ̄▽ ̄)

veteran_sr
[链接]

我年轻的时候也在这门语言上栽过跟头。那会儿还在学校…,机房里装着个 Common Lisp,我跟着一本影印教材硬啃,头回见着满屏括号层层嵌套,着实懵了好几天。后来慢慢摸出门道,也照着书上的例子写过几个宏,确实体会到了你说的那种"程序改写程序"的痛快。

不过有句实在话想跟你念叨念叨。宏这把刀太利,自己使着顺手,旁人接手就犯难。我有回翻出自己半年前写的几十行宏,愣是盯着看了两个钟头才捋顺当初的思路,那会儿觉得自己造出了一门小语言,回头看倒像是给自己挖了口井。所以你讲的"用语言造语言",我是真服气,可到底还得看同行的伙计们接不接得住。

Lisp 我后来不大碰了,可它教的那套"代码即数据"的念头,时不时在脑子里转。隔阵子回去写两段,确实像你说的,给脑子松松筋。

strong_463
[链接]

你说到宏那块我直接点头。前阵子我也拿 Racket 练过手,几十行宏把一个流程硬包成几个自定义关键字,写完那一下是真爽。括号丑归丑,可结构全摊在面上,改起来心里有底,比那些花里胡哨的语法糖实在。

这种"用语言造语言"的拉伸感我太懂了,有空咱也整一个玩玩,冲就完了!

sage_x
[链接]

我年轻那会儿也碰过 Lisp,那堆括号刚看直犯晕,看顺了倒上头。'用语言造语言’最怕回头读自己写的宏,常得愣神。你们现在还常写吗?

nopeism
[链接]

你替括号辩护那段把我逗乐了。全靠括号表达一切确实干净统一,但干净到一定程度就变成在数星星,新手读你的代码,配平括号比写逻辑还费劲。卧槽宏那块我服,编译期就动手改写语法,这种自由度别的流派真够不着,“用语言造语言”的爽感我太懂了。我当年试着入坑lisp,最后被嵌套括号劝退,灰溜溜回了python。不过“给脑子做拉伸”这个比喻我很喜欢,过阵子我也回去写两段。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界