【问题标题】:Converting a Scheme constant that is bound to a function into equivalent Common Lisp将绑定到函数的 Scheme 常量转换为等效的 Common Lisp
【发布时间】:2016-08-30 13:32:20
【问题描述】:

我正在将一些 Scheme 代码转换为 Common Lisp。我不知道方案。我懂一点 Common Lisp。

首先,Scheme 代码定义了一个变量(或者是一个常量?),其值为函数的名称:

(define alert-propagator alert-propagators)

函数如下:

(define (alert-propagators propagators)
    ...)

然后通过引用常量间接调用该函数:

(alert-propagator arg)

这很漂亮。

我想知道这在 Common Lisp 中是否也可以实现?这是我尝试过的:首先,我定义了一个常量并将其绑定到一个函数:

(defconstant alert-propagator #'alert-propagators)

然后我定义了函数:

(defun alert-propagators (propagators)
    ...)

很好。

但是现在,为了间接调用函数(通过常量),我必须使用 funcall:

(funcall alert-propagator arg)

我认为这违背了定义常量(抽象)的整个目的。我真正想要的是能够简单地写:

(alert-propagator arg)

有没有办法在 Common Lisp 中实现这一点?

【问题讨论】:

    标签: scheme


    【解决方案1】:

    Common Lisp 是一个 LISP2,这意味着操作符位置的标识符和其他位置的标识符有不同的命名空间。

    (defun square (x)
      (* x x))
    
    (defparameter square 10) ; unconventional, should be *square*
    
    (square square) ; ==> 100
    

    这不能在 Scheme 中完成,因为 (square square) 两个 square 标识符都指向完全相同的对象。它可能是一个将函数作为参数的函数(Scheme 中的过程)。

    您可以使用(function square) 或语法糖缩写#'square 从函数名称空间中获取对象,因此您可以将绑定在函数名称空间中的实际函数作为值获取。

    您还可以使用symbol-function 获取函数命名空间值,这样(symbol-function 'square) 的计算结果与#'square 相同。它具有可以用作setf 位置的功能,用于将函数命名空间中的某些内容设置为一个值。只有当第二个参数实际上是一个函数时它才有效:

    (setf (symbol-function 'test) #'square)
    (test square) ; ==> 100
    

    defconstantdefparameterdefvar 没有在函数命名空间中设置任何内容。 Thay 只能用作普通变量,您也可以将其用于可与funcallapply 一起应用的函数。

    您应该避免将defconstant 用于其他所有值,因为系统允许内联,因此除非您重新阅读和重新编译,否则更改常量可能不会影响代码。在所有实际用途中,使用defparameter 和正确的+NAMING-CONVENTION+ 将适用于像+VAT+ 这样明年可能会改变的半常量!

    方案没有常量,但 R5RS 中的零环境预计会以与原始程序处理的数据相同的方式工作,因此使用原始版本的常量折叠不会破坏任何内容。使用 R6RS(可能还有 R7RS)导入的表单不能被覆盖,即使是其他导入语句。在 Scheme 中,您无需使用 define 重新定义,而是使用 set! 重新定义,就像您可以使用 setfsetq 来设置您在 Common Lisp 中使用 defparamaterdefvar 创建的变量一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多