Franz LISP对常见的LISP转换问题

时间:2017-01-12 02:27:29

标签: common-lisp

从20世纪80年代初开始,我正在恢复旧的LISP计划。 (这是Nelson-Oppen简化器,一种早期的证明系统。 这个版本是Ford Pascal-F Verifier的一部分, 并于1982年在Franz LISP中运行。)这是 整个计划:

ignore files in vs

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

HUNKSHELL

Hunkshell是一个20世纪70年代的斯坦福SAIL黑客,支持在LISP中使用命名字段的记录。我想我已经转好了;它似乎有效。

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

原始宏生成了更多宏作为记录更新功能。 我正在生成defun个。有没有理由生成宏?

顺便说一下,看看我为“CONCAT”写的内容。有没有更好的办法 这样做?

DEFMAC

更多旧的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来获取函数指针?

SPECIAL

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

1 个答案:

答案 0 :(得分:3)

的毗连

基本上是正确的,但缩进被打破(就像其他地方一样 - 我建议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

PS。您了解CR.se网站吗?