从20世纪80年代初开始,我正在恢复旧的LISP计划。 (这是Nelson-Oppen简化器,一种早期的证明系统。 这个版本是Ford Pascal-F Verifier的一部分, 并于1982年在Franz LISP中运行。)这是 整个计划:
我正在将代码转换为在Linux上的clisp下运行, 并需要一些建议。大多数问题都与之相关 宏。
Hunkshell是一个20世纪70年代的斯坦福SAIL黑客,支持在LISP中使用命名字段的记录。我想我已经转好了;它似乎有效。
https://github.com/John-Nagle/pasv/tree/master/src/CPC4
原始宏生成了更多宏作为记录更新功能。
我正在生成defun
个。有没有理由生成宏?
顺便说一下,看看我为“CONCAT”写的内容。有没有更好的办法 这样做?
更多旧的SAIL宏,以便在defmacro
成为语言的一部分之前使宏定义更容易。
https://github.com/John-Nagle/pasv/blob/master/src/CPC4/hunkshell.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))
?
答案 0 :(得分:3)
基本上是正确的,但缩进被打破(就像其他地方一样 - 我建议Emacs来修复它)。
此外,您不需要values
那里。
我建议改为defparameter
setq
。一般来说,在设置变量之前(例如,setq
),应该establish它(例如,let
或defvar
)
fdefinition
就是这样
您正在寻找而不是getd
。
我也不认为你正在使用反引号:
(defmacro defunobj (fname &body body)
`(progn
(defun ,fname ,@body)
(defparameter ,fname (fdefinition ',fname))))
我认为defvar
and defparameter
优于proclaim
special
PS。您了解CR.se网站吗?