16、LISP编程:A语言与PDP - 1计算机实现

LISP编程:A语言与PDP - 1计算机实现

1. A语言系统概述

A语言系统是一种特定的编程体系,包含众多函数定义。以下是部分关键函数的代码片段:

DEFINE (
    (6iOT (LAMBDA a0 (COND ((FQ X T) NIL ) (Tl'))))
    (&AST (LAMBDA O() (COND ((NULL XI NIL ) ((BULL (CDR Xjj (CAR XI) fl (LAST (CDR X) ) ) )))
    ...
)

这些函数涉及条件判断、列表操作、符号定义等多种编程元素。例如, COND 函数用于条件判断,根据不同条件执行不同操作。

1.1 A语言的应用示例

在字母序列预测方面,A语言展现出强大的功能。以下是具体的输入示例:

(LISTB ((PUT (LIST A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) INTO ALMABEI)
(PUT 0.5F.O INTO PARAI2)
(PUT 0.66999999EO INTO PARM3)
RIT LENGTH OF ALPHABEI INTO PARM4
(PUT PARM4 MS 1 IWO PARM5
...
)

此示例中,我们可以看到对字母表、参数的设置和存储操作。通过这些操作,为后续的字母序列预测提供了数据基础。

1.2 关键函数及操作

  • 位置函数 POSITION 函数用于确定元素在列表中的位置。例如, (POSITION OF X IN A) 可以计算 X A 中的位置。
  • 序列处理函数 POSITIONLIST 函数可以处理列表中的元素位置,将列表中每个元素的位置信息组合成一个新的列表。
  • 差异函数 FIRSTDIFFERENCE 函数用于找出两个列表的首个不同元素。

1.3 操作流程

  1. 数据初始化 :将字母表和相关参数存储到指定的变量中。
  2. 函数定义 :定义各种用于处理字母序列的函数,如位置函数、差异函数等。
  3. 数据处理 :使用定义好的函数对字母序列进行处理,得出预测结果。

2. PDP - 1计算机上的LISP实现

2.1 系统简介

1963 年 10 月,L. Peter Deutsch 完成了在 PDP - 1 计算机上实现 LISP 的系统,1964 年 3 月进一步改进,形成了 Basic PDP - 1 LISP。该系统具有以下特点:
- 资源使用 :在单核心 PDP - 1 计算机的 4096 个寄存器中,最少使用约 2000 个寄存器;在四核心计算机中,最多可使用 16361 个寄存器。
- 灵活性 :可定义和包含额外的 LISP 函数,也可插入兼容的机器语言子程序。

2.2 包含的函数和特性

2.2.1 与 IBM 7090 LISP 相同的函数
函数 说明
ATM 判断是否为原子
CAR 获取列表的第一个元素
CDR 获取列表除第一个元素外的剩余部分
CONS 构建新的列表
EVAL 计算表达式的值
2.2.2 与 IBM 7090 LISP 略有不同的函数
  • EQ :可用于原子和数字的比较。
  • GREATERP :仅测试 X 是否大于 Y ,而非大于或等于。
  • STOP :相当于 7090 LISP 中的 PAUSE ,会使计算机暂停并在累加器中显示数值参数。
2.2.3 7090 LISP 中没有的函数
  • SUBR :用于存储和执行命名的机器语言子程序。
  • LOCX :返回原子或列表开始的机器寄存器位置。

2.3 系统使用和测试

2.3.1 使用步骤
  1. 将基本的 PDP - 1 LISP 系统读入计算机,控制会停在寄存器 4。
  2. 打开感应开关 5 以使用打字机输入,按下 CONTINUE ,系统进入等待循环。
  3. 在打字机上输入表达式,以空格结束,计算机将计算并输出结果。
2.3.2 测试序列示例
输入 响应
(CAR (QUOTE (A B c D))) A
(COND (EQ T NIL) (STOP 1)) 计算机停止,累加器显示 2

2.4 辅助函数和额外功能

2.4.1 辅助函数

可以通过准备穿孔纸带列表,将以下辅助函数插入系统:
- CDAFt :获取列表第一个元素的剩余部分。
- CDDR :获取列表除前两个元素外的剩余部分。
- CSETQ :设置变量的值。

2.4.2 额外功能
  • REMOVE :从 OBLIST 中移除符号,释放占用的存储容量。
  • DEPOSIT :将数字列表存储到指定位置。
  • PZTSUBR :将存储的子程序设置为可被 LISP 解释器调用的 SUBR

2.5 输入和输出规则

2.5.1 输入规则
  • 符号等效 :制表符、空格和逗号等效。
  • 大小写处理 :字母通常使用小写,基本函数以小写符号存储。
  • 表达式结束 :需输入额外的空格来结束整个表达式。
2.5.2 输出规则
  • 自动换行 :每 100 个八进制字符(不包含回车)后自动换行。
  • 无空格分隔 :与 7090 LISP 输出不同, * . 连接前后无空格。

2.6 系统操作和错误诊断

2.6.1 系统操作
  1. 使用零核心以避免不必要的问题。
  2. 将二进制磁带放入阅读器,按下 READIN ,等待磁带停止。
  3. 根据需要设置最高存储寄存器和推下列表的长度。
  4. 打开感应开关 5,按下 CONTINUE ,使 LISP 系统准备好使用。
2.6.2 错误诊断

错误停止时,会在打字机上以红色显示错误代码。常见错误包括:
- icd :非法操作,返回 NIL 并继续。
- uss SMIQ 中未绑定的符号,返回 NIL 并继续。
- tma SWR 的参数过多(超过 3 个),忽略多余参数并继续。

2.7 宏符号程序

2.7.1 符号定义

宏符号程序中定义了众多符号,用于实现各种功能。例如:

define load A,B (move (B,A))
define count A,B (isp A; jmp B)
...

这些符号定义了数据加载、计数等操作。

2.7.2 程序流程

程序包含多个部分,如初始化、数据处理、错误处理等。以下是部分流程的 mermaid 流程图:

graph TD;
    A[开始] --> B[初始化参数];
    B --> C[读取输入];
    C --> D{是否为合法输入};
    D -- 是 --> E[处理输入];
    D -- 否 --> F[显示错误信息];
    E --> G[输出结果];
    F --> C;
    G --> H[结束];

2.8 符号的助记和推导

为了更方便地理解宏符号程序,对部分符号进行了助记和推导说明:
- a0 :参数,子零。
- a1 :参数,子一。
- car :获取列表的第一个元素。

通过这些助记说明,我们可以更清晰地理解程序中符号的含义和作用。

综上所述,A语言和 Basic PDP - 1 LISP 系统为编程提供了丰富的功能和灵活的操作方式。无论是字母序列预测还是在 PDP - 1 计算机上的编程实现,都展示了其强大的能力和广泛的应用场景。在实际使用中,我们需要遵循相应的规则和流程,合理利用各种函数和工具,以实现我们的编程目标。

3. 详细函数分析与代码示例

3.1 函数分类及功能

为了更清晰地了解系统中的函数,我们将其分为几类进行详细分析。

3.1.1 基本列表操作函数
函数 功能 代码示例
CAR 获取列表的第一个元素 (CAR (QUOTE (A B C))) 返回 A
CDR 获取列表除第一个元素外的剩余部分 (CDR (QUOTE (A B C))) 返回 (B C)
CONS 构建新的列表 (CONS 'A (QUOTE (B C))) 返回 (A B C)
3.1.2 条件判断函数
函数 功能 代码示例
COND 根据条件执行不同操作 (COND ((EQ 'A 'A) 'True) ((EQ 'A 'B) 'False)) 返回 True
EQ 判断两个元素是否相等 (EQ 'A 'A) 返回 T (EQ 'A 'B) 返回 NIL
3.1.3 算术运算函数
函数 功能 代码示例
PLUS 加法运算 (PLUS 2 3) 返回 5
TIMES 乘法运算 (TIMES 2 3) 返回 6

3.2 函数的实际应用

以下是一个结合多种函数的实际应用示例,用于计算列表中元素的总和:

(DEFINE (SUM-LIST (LAMBDA (X) 
    (COND ((NULL X) 0) 
          (T (PLUS (CAR X) (SUM-LIST (CDR X)))))))

(SUM-LIST (QUOTE (1 2 3 4 5)))

在这个示例中, SUM-LIST 函数通过递归的方式遍历列表,将每个元素相加,最终返回列表元素的总和。

3.3 函数的嵌套使用

函数可以嵌套使用,以实现更复杂的功能。例如,我们可以结合 COND EQ 函数来判断列表是否为空:

(DEFINE (IS-EMPTY (LAMBDA (X) 
    (COND ((EQ (NULL X) T) 'True) 
          (T 'False))))

(IS-EMPTY (QUOTE ()))
(IS-EMPTY (QUOTE (A B C)))

在上述代码中, IS-EMPTY 函数使用 COND EQ 函数判断列表是否为空,并返回相应的结果。

4. 系统的灵活性与扩展性

4.1 存储容量的调整

Basic PDP - 1 LISP 系统在存储容量方面具有很高的灵活性。在单核心 PDP - 1 计算机中,存储容量可以在较小的范围内(如 4000 八进制以下)到较大的范围(如 7750 八进制)之间调整。具体操作步骤如下:
1. 当系统第一次停止时,将最高存储寄存器的编号(建议 5000 - 7750 八进制,4000 - 4777 八进制不建议)设置在测试字开关上,然后按下 CONTINUE
2. 接着,将推下列表的长度(建议 200 - 400)设置在测试字开关上,再次按下 CONTINUE

4.2 机器子程序的使用

系统允许使用机器子程序,以扩展其功能。以下是使用机器子程序的步骤:
1. 存储子程序 :将机器语言子程序存储在计算机中,确保其位置高于空闲存储的最高寄存器。
2. 命名子程序 :使用 DEFSUBR 函数为子程序命名,使其可以被 LISP 解释器调用。
3. 调用子程序 :在 LISP 代码中使用命名后的子程序。

例如,假设我们有一个名为 SHOWLINE 的子程序,存储在寄存器 5500 开始的位置,我们可以使用以下代码将其命名并调用:

(DEFSUBR 'SHOWLINE 5500)
(SHOWLINE)

4.3 系统的扩展性

系统的扩展性体现在可以定义和包含额外的 LISP 函数。我们可以通过准备穿孔纸带列表,将自定义的函数插入系统。例如,我们可以定义一个新的函数 DOUBLE 用于将输入的数字翻倍:

(DEFINE (DOUBLE (LAMBDA (X) (PLUS X X))))
(DOUBLE 5)

通过这种方式,我们可以根据实际需求扩展系统的功能。

5. 总结与展望

5.1 系统优势总结

  • 功能丰富 :包含众多基本和高级函数,可满足不同的编程需求。
  • 灵活性高 :存储容量可调整,支持使用机器子程序,方便扩展功能。
  • 易于理解 :通过助记符号和详细的推导说明,降低了编程的难度。

5.2 未来发展方向

  • 性能优化 :进一步提高系统的运行效率,减少资源占用。
  • 功能扩展 :增加更多的内置函数和工具,提供更强大的编程支持。
  • 兼容性提升 :与更多的计算机系统和编程语言进行兼容,扩大应用范围。

5.3 实际应用建议

在实际应用中,建议开发者充分利用系统的灵活性和扩展性,结合具体需求进行定制化开发。同时,遵循系统的输入输出规则和操作流程,以确保程序的正确性和稳定性。

通过对 A语言和 Basic PDP - 1 LISP 系统的深入了解,我们可以看到其在编程领域的重要价值和广泛应用前景。无论是初学者还是有经验的开发者,都可以从这个系统中获得丰富的编程资源和强大的工具支持。

以下是一个总结系统操作流程的 mermaid 流程图:

graph TD;
    A[系统启动] --> B[设置存储参数];
    B --> C[加载程序];
    C --> D{是否需要扩展功能};
    D -- 是 --> E[插入额外函数或子程序];
    D -- 否 --> F[输入表达式];
    E --> F;
    F --> G{表达式是否合法};
    G -- 是 --> H[执行表达式];
    G -- 否 --> I[显示错误信息];
    H --> J[输出结果];
    I --> F;
    J --> K[系统结束];

这个流程图展示了系统从启动到结束的完整操作流程,包括存储参数设置、程序加载、功能扩展、表达式输入和执行等环节。通过这个流程图,我们可以更清晰地了解系统的操作步骤和逻辑关系。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值