gpt4 book ai didi

common-lisp - Franz LISP 到 Common LISP 的转换问题

转载 作者:行者123 更新时间:2023-12-04 02:48:11 25 4
gpt4 key购买 nike

我正在恢复 1980 年代早期的旧 LISP 程序。(这是 Nelson-Oppen 简化器,一个早期的证明系统。这个版本是 Ford Pascal-F Verifier 的一部分,并于 1982 年在 Franz LISP 中运行。)这是整个程序:

https://github.com/John-Nagle/pasv/tree/master/src/CPC4

我正在将代码转换为在 Linux 上的 clisp 下运行,需要一些建议。大多数问题都与宏。

大壳

Hunkshell 是 1970 年代斯坦福 SAIL 黑客,用于支持 LISP 中具有命名字段的记录。我想我已经把这个转换好了;它似乎有效。

https://github.com/John-Nagle/pasv/blob/master/src/CPC4/hunkshell.l

原始宏生成更多宏作为记录更新函数。我正在生成 defun。有没有理由生成宏?

顺便看看我为“CONCAT”写的东西。有没有更好的办法这样做?

DEFMAC

更多旧的 SAIL 宏,以便在 defmacro 成为语言的一部分之前使宏定义更容易。

https://github.com/John-Nagle/pasv/blob/master/src/CPC4/defmac.l

我一直在与“defunobj”作斗争。这是我的 CL 版本,部分转换:

  ; This macro works just like defun, except that both the value and the
; function-binding of the symbol being defined are set to the function
; being defined. Therefore, after (defunobj f ...), (f ...) calls the
; defined function, whereas f evaluates to the function itself.
;
(defmacro defunobj (fname args &rest b)
`(progn
(defun ,fname ,args ,b)
;;;;(declare (special ,fname)) ;;;; ***declare not allowed here
(setq ,fname (getd ',fname))))

如果我将 declare 设为 proclaim,这样行得通吗?用什么代替 getd 来获取函数指针?

特别的

顶部有很多(DECLARE (SPECIAL FOO))声明此代码中的级别。这在 CL 中是不允许的。是吗适合使用 (PROCLAIM (SPECIAL FOO)) 代替吗?

最佳答案

连接

基本上是正确的,但缩进被破坏了(就像其他地方一样 - 我建议 Emacs 修复它)。

此外,您不需要 values那里。

defunobj

我建议 defparameter反而的 setq .一般来说,在设置一个变量之前(例如,使用setq)应该establish它(例如,letdefvar)。

fdefinition是什么你正在寻找而不是 getd

我也不认为你在正确使用反引号:

(defmacro defunobj (fname &body body)
`(progn
(defun ,fname ,@body)
(defparameter ,fname (fdefinition ',fname))))

特别

我认为defvar and defparameter优于proclaim special .

附言。你知道CR.se吗?网站?

关于common-lisp - Franz LISP 到 Common LISP 的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41604147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com