【问题标题】:common lisp function/macro aliases常见的 lisp 函数/宏别名
【发布时间】:2017-03-26 20:37:41
【问题描述】:

我想在常用的lisp(准确地说是clisp)中为“defun”和“lambda”等经常使用的命令设置别名,可以这样做吗?

这实际上是 question 的复制品,但我无法发表评论,并且该解决方案不适用于 sbcl 和 clisp 中的 defun 或 lambda

【问题讨论】:

    标签: common-lisp clisp


    【解决方案1】:

    宏:

    CL-USER 5 > (setf (macro-function 'dm) (macro-function 'defmethod))
    #<Function DEFMETHOD 410009A014>
    
    CL-USER 6 > (dm m1+ ((v vector)) (map 'vector #'1+ v))
    #<STANDARD-METHOD M1+ NIL (VECTOR) 4130003913>
    
    CL-USER 7 > (m1+ #(1 2 3 4))
    #(2 3 4 5)
    

    【讨论】:

      【解决方案2】:

      宏的全部意义在于提供源代码重写服务。因此我想给你这个,你可以从中得到它:

      (defmacro df (name (&rest arguments) &body body)
        `(defun ,name ,arguments ,@body))
      
      (df test (x) (+ x x))
      (test 5) ; ==> 10
      

      我们刚刚缩短了名称..让我们再做一个:

      (defmacro df1 (name &body body)
        `(defun ,name (_) ,@body))
      
      (df1 test (+ _ _))
      (test 5) ; ==> 10
      

      等等……

      【讨论】:

      • 单独使用:就是undefined according to the standard。似乎 ABCL、CLisp 和 ECL 接受它作为名称为 "" 的符号; ACL、CCL、LW 和 SBCL 不接受该语法。
      • @acelent : 在 CL 中是特殊的,这是有道理的。我选择了别的东西。
      • 这比我想象的要复杂一些,因为我仍然了解一般的术语和宏。知道这将如何转化为(的方言)方案吗?
      • @DiiP 宏就像一个函数,它将未评估的代码作为参数。 (df1 test (+ _ _)) 首先调用宏函数,name 作为符号 test 和主体作为列表 ((+ _ _)),然后宏函数生成数据结构 (defun test (_) (+ _ _)),这就是 Common Lisp 可以评估的实际代码。 Scheme 宏,除了语法规则,有点复杂。
      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      相关资源
      最近更新 更多