探索 PDP-1 Lisp (1960)
进行中,这是我自己学习 PDP-1 Lisp 时的修改。但希望这能帮助你入门。在 Google 小组中非常欢迎反馈 :-) 一、PDP-1 Lisp:简介 Lisp 是由约翰·麦卡锡(John McCarthy)在 1958 年于麻省理工学院(MIT)开发的。它开创了一种高层次的符号编程语言,旨在用于 AI 研究。早期 Lisp 引入了递归、符号表达式和自动存储管理等关键概念。PDP-1 版本由彼得·多伊奇(Peter Deutsch)于 1960 年实现,他是 MIT 教授的儿子,但当时只有 14 岁,仍在读高中。它是一种高度简约且高效的 Lisp,适用于小型的 PDP-1。值得注意的是,他沿途发明了读–评估–打印循环(REPL)的概念(许多Python使用者都熟悉)。换句话说,这是第一个交互式编程环境——一个重大的创新,并且到今天仍然是 Lisp 的核心。 PDP-1 Lisp 将 Lisp 从一种理论上的、穿孔卡片加载的语言发展成为一种实用的、交互式的工具。这本身就是计算机发展的一个里程碑! 本页面只提供 PDP-1 Lisp 的快速入门指南。无需掌握 Lisp,这只是展示了 Lisp 在 PDP-1 上的运作方式。作为进入 Lisp 世界的起点是很有用的——即使你不想深入了解 Lisp 本身,它仍然很有趣。一旦深入细节,两个手册将是必不可少的。第一个是 PDP-1 Lisp 手册(链接),第二个是原始的完整功能 Lisp 1.5 程序员手册(链接),这是多伊奇作为目标使用的 IBM 7090。IBM Lisp 1.5 手册对 Lisp 1.5 的总体情况提供了很好的概述,而 PDP-1 Lisp 手册则解释了如何使用 PDP-1 版本——实操和语言差异。 PDP-1 Lisp 比我最初想的更加诱人……但首先,让我们快速概述一下 PDP-1 Lisp 的实践。 1. 启动 Lisp 设置扩展开关 确保为其他 PDP-1 程序再将扩展开关设回下方。对于常规 PDP-1 程序,此开关开启将导致 READ IN 失败,如果你忘记这是一个主要的困惑源。 挂载 lisp.rim 磁带。按下 READ IN。 将 TW 开关设置为 7750,以定义 Lisp 存储的上级内存地址,按下 CONTINUE,将 TW 开关设置为 400,以定义推送下列表的长度,按下 CONTINUE,设置感应开关 5,以启用打字机输入。第三次按下 CONTINUE。如果 SS5 未设置,则输入将来自刚插入的纸带。因此,你可以挂载一个带有 Lisp 函数的纸带,然后在没有设置 SS5 的情况下按下 Continue。稍后我们会详细讲解。 现在你可以在 PDP-1 上使用基本 Lisp 了! 在继续之前需要了解一些事项:在此时始终将地址开关设置为 0004。因为在运行 Lisp 程序后,你只需按 START 和 CONTINUE 就可返回到 Lisp。此外,打字错误和错误会使 Lisp 停止运行。这是正常的。例如,输入 'nix[space]' 而不是 'nil[space]'。在这种情况下,只需按 START,然后 CONTINUE。但确保地址开关指向起始位置 4。 通过添加一个结束空格而不是按回车键来输入行。因此,要查看定义了哪些原子符号,输入 oblist [Space] 。在继续输入之前,检查 Lisp 是否仍在运行总是很有用!输入 'nil',即使 Lisp 未在运行,你也会看到已输入。如果没有,Lisp 应该在新行上返回第二个 'nil'。如果没有:START,然后 CONTINUE。 在 PDP-1 Lisp 中,你可能会养成在输入新内容之前快速检查 'nil' 的习惯。这也是在新行开始的最佳方式……输入 (plus 1 2) 输出 3。注意 'plus' 而不是 '+'!(times 4 4) 正确输出 20。因为 20 八进制是 16 十进制……现在,让我们输入一个小程序(在输入程序时使用 [Return] 和 [tab] 键): (prog (a b) (setq a 4) (setq b 4) (plus a b) (return (plus a b))) …并在后面加上 [space]。这将返回 10。因为实际上,4+4=10,八进制 :-) 2. 加载和保存纸带输入 因为实际保存新创建代码到纸带的 Lisp 函数并未内置于基本 Lisp 中,所以你需要首先从纸带中加载该函数。这也是在 Lisp 中加载任何代码的常规方法:挂载字母数字磁带 lisp-defs.pt 将 SS5 设置为下,立刻开始读取磁带。 你将看到新加载的函数在打字机输出中显示:zerop pdef count 将 SS5 设置为上,以便进行打字机输入,按下 START,然后 CONTINUE。 确保地址开关确实设置为 4。这就是加载任何 Lisp 代码的工作方式。挂载带有你功能的字母数字磁带,设置 SS5,并查看它们加载。 准备一个测试磁带以读取你自己的功能 首先,准备一个小测试磁带。将以下内容粘贴到名为 test.lisp 的文件中: (rplacd (quote tt) (quote (expr (lambda () (prog () (print (quote hello)) (terpri) (return 5))))) ) [space] 确保代码的最后一行以空格结束以终止函数。现在制作纸带。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡