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