惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
V
V2EX
博客园 - 【当耐特】
Vercel News
Vercel News
雷峰网
雷峰网
爱范儿
爱范儿
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
NISL@THU
NISL@THU
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
P
Proofpoint News Feed
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
I
InfoQ
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 最新话题
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
V
Visual Studio Blog
AI
AI
Schneier on Security
Schneier on Security
B
Blog RSS Feed
T
Tor Project blog
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cyber Attacks, Cyber Crime and Cyber Security
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
Webroot Blog
Webroot Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
[译]Lisp、Smalltalk 和对称性的力量
种瓜 · 2022-08-12 · via 夜行人

文章目录

前言

原文: Lisp, Smalltalk, and the Power of Symmetry

译文

和许多黑客一样,我第一门真正爱上的编程语言是 Lisp。保罗·格雷厄姆(Paul Graham)激发了我对这种语言的探索,他是个特别的 Lisp 倡导者,写了很多关于 Lisp 的文章,谈论是什么让它与众不同。那么,是什么让 Lisp 与众不同呢?尽管 Lisp 发明于 1958 年,是世界上第二古老的高级编程语言,为什么 Lisp 仍然是现存最强大、最灵活、最简洁的编程语言之一?

保罗·格雷厄姆的回答是宏(macro)

许多语言都有一个叫做宏的东西。但 Lisp 的宏是独一无二的。[…]
Lisp 代码是由 Lisp 数据对象组成的。这并不是在琐碎的意义上说,源文件包含字符串,字符串是语言支持的数据类型之一。Lisp 代码,在被解析器(parser)读取后,是由你可以遍历的数据结构组成的。
如果你了解编译器(compilers)是如何工作的,实际发生的事情并不是 Lisp 有一个奇怪的语法,而是 Lisp 根本没有语法。当其他语言被解析时,你在编译器内生成的解析树中编写程序。但是这些解析树对于你的程序来说是完全可以访问的。你可以写程序来操作它们。在 Lisp 中,这些程序被称为宏。它们是编写程序的程序。

保罗的论点里,隐藏着一个有趣的暗示。他说,宏使 Lisp 变得强大,因为它们允许你编写本身就能编写程序的程序。但是,这就是宏,而不是使宏成为可能的东西–Lisp 的宏不是它强大的原因,而是它的一个症状。使 Lisp 强大的不是它的宏,而是这一事实: Lisp 运行在编写它的上下文中。至始至终都是 S-表达式。这导致了一种有趣的可能性:是否有其他方法来实现类似的功能?宏是让程序编写程序的唯一方式吗?还是有其他的方式?

当我在大学学习计算机语言时,我们在 Lisp 之后研究的第二种语言是 Smalltalk。我对 Lisp 的力量和灵活性印象深刻,所以那天我的第一个问题是:“Smalltalk 有宏吗?” 教授在思考了一会儿之后,回答说:“Smalltalk 不需要宏”。嗯?Smalltalk 不需要宏?为什么不需要?那它有什么?我花了三年时间才搞清楚。Smalltalk 不需要宏,因为它有类(class)。

将面向对象的类与 Lisp 的宏相提并论似乎有些奇怪。类和类结构不是出了名的僵化脆弱,而且容易产生意大利面条代码吗?这些不都是 Lisp 宏的反面吗?

当 OOP 指的是 “我在设计这个类的层次结构时在想什么” 时,面向对象编程(“OOP”)的一般风味确实如此。Java、C++、甚至 Python 等语言似乎认为 “面向对象” 主要意味着 “类和继承”。这有点像说 “开车” 主要意味着 “按钮和踏板”。大多数这些语言都忽略了一点,那就是 Smalltalk 的类系统,就像 Lisp 的宏系统一样,是语言中已经存在的力量的一个症状,而不是其原因。如果它不具备这些功能,那么自己添加这些功能并不难。

如果没有 Smalltalk 的底层基础,类的继承只不过是一种代码重用的工具。在这类工具,它既不是唯一也不一定是最好的。Smalltalk 对象系统的真正力量(包括类),不是继承,而是反射(reflection)。正如 Lisp 宏之所以强大,是因为它们可以对任何 Lisp 代码进行操作,包括它们自己,Smalltalk 类之所以强大,是因为它们本身就是对象。Smalltalk 和 Lisp 一样,都是在其编写的上下文中运行的一路往下都是对象

Lisp 之所以强大,是因为所有的 Lisp 程序也是 Lisp 数据–所有可以运行的东西都可以被写成/读S-表达式。Lisp 中的宏只是当你归纳应用这种关系时发生的事情:它们是操作数据的代码,而数据本身就是代码。

Smalltalk 之所以强大,是因为所有的 Smalltalk 数据都是程序–所有的信息都是由运行的、活生生的对象体现出来的。Smalltalk 中的类编程只是操作本身就是数据的程序–这是 Lisp 哲学的反面,但最终结果是一样的。正是它使 Smalltalk 调试器能够冻结、剖析、修改和恢复正在执行的程序。它使浏览器(browser)能够立即找到所有响应给定消息的对象,或找到给定对象的所有超类和子类,或找到给定类的每个运行实例。这就是为什么 Smalltalk 集成开发环境不仅仅是用这种语言编写的,它实际上就是这种语言。

正如保罗在前头提到的,Lisp 实际上没有语法: 因为 Lisp 源代码、运行中的 Lisp 代码、Lisp 数据 表达形式相同,三者是可以互换的。程序可以改写数据,而这些数据可以作为程序运行,这些程序可以改写数据…

Smalltalk 比 Lisp 更进一步:并不是说 Smalltalk 的源代码没有语法,而是 Smalltalk 没有源代码。毕竟,“源代码” 只是意味着 “没有运行的程序”,而没有运行的 Smalltalk 程序是不存在的。因为在 Smalltalk 中,除了 “运行的数据”(对象)之外,别无他物,所以在 Smalltalk 中没有数据和程序的区别。数据(对象)可以编写程序(对象),程序(对象)可以编写数据(对象)…

所以 Lisp 宏并不是让程序写程序的唯一方式。一种语言要允许这样做,似乎唯一需要的是程序和数据之间普遍存在的对称性。如果一种语言允许程序和数据被视为同一事物,那么这种语言就会变得容易和无限扩展–一种上帝的语言。事实证明,S-表达式并不是做到这点的唯一方法–你也可以用对象来做到这点。我想知道是否还有我们尚未尝试过的其他方法,能做到这点呢?