当前位置: 首页 > 编程笔记 >

common-lisp 常见的宏模式

彭正谊
2023-03-14
本文向大家介绍common-lisp 常见的宏模式,包括了common-lisp 常见的宏模式的使用技巧和注意事项,需要的朋友参考一下

示例

待办事项:也许将说明移到备注处并分别添加示例

FOOF

在Common Lisp中,有一个通用引用的概念。它们允许程序员将值设置为各种“位置”,就好像它们是变量一样。利用此功能的宏通常F在名称中带有-postfix。该位置通常是宏的第一个参数。

从标准的例子:INCF,DECF,ROTATEF,SHIFTF,REMF。

一个愚蠢的例子,一个宏,它在一个地方翻转数字存储的符号:

(defmacro flipf (place)
  `(setf ,place (- ,place)))

带脚

获取并安全释放资源的宏通常以WITH--prefix命名。该宏通常应使用如下语法:

(with-foo (variable details-of-the-foo...)
  body...)

从标准的例子:WITH-OPEN-FILE,WITH-OPEN-STREAM,WITH-INPUT-FROM-STRING,WITH-OUTPUT-TO-STRING。

一种可以避免名称污染和意外的多重评估的陷阱的实现此类宏的方法是,首先实现功能版本。例如,实现with-widget可以安全地创建小部件并随后进行清理的宏的第一步可能是一个函数:

(defun call-with-widget (args function)
  (let ((widget (apply #'make-widget args))) ; obtain WIDGET
    (unwind-protect (funcall function widget)  ; call FUNCTION with WIDGET
      (cleanup widget)                         ; cleanup

由于这是一个函数,因此无需担心函数供应商中名称的范围,并且可以轻松编写相应的宏:

(defmacro with-widget ((var &rest args) &body body)
  `(call-with-widget (list ,@args) (lambda (,var) ,@body)))

豆腐

遍历某些事物的宏通常以DO-prefix命名。宏语法通常应采用以下形式

(do-foo (variable the-foo-being-done return-value)
  body...)

从标准的例子:DOTIMES,DOLIST,DO-SYMBOLS。

关注,关注,关注

在某些情况下匹配输入的宏通常用CASE-postfix命名。通常有一个E...CASE-variant,如果输入与任何情况都不匹配,则表示错误,而带有-variant则C...CASE表示连续错误。他们应该具有如下语法

(foocase input
  (case-to-match-against (optionally-some-params-for-the-case)
   case-body-forms...)
  more-cases...
  [(otherwise otherwise-body)])

从标准的例子:CASE,TYPECASE,HANDLER-CASE。

例如,一个宏,该字符串将字符串与正则表达式匹配,并将寄存器组绑定到变量。对正则表达式使用CL-PPCRE。

(defmacro regexcase (input &body cases)
  (let ((block-sym (gensym "block"))
        (input-sym (gensym "input")))
    `(let ((,input-sym ,input))
       (block ,block-sym
         ,@(loop for (regex vars . body) in cases
                 if (eql regex 'otherwise)
                   collect `(return-from ,block-sym (progn ,vars ,@body))
                 else
                   collect `(cl-ppcre:register-groups-bind ,vars
                                (,regex ,input-sym)
                              (return-from ,block-sym
                                (progn ,@body))))))))

(defun test (input)
  (regexcase input
    ("(\\d+)-(\\d+)" (foo bar)
      (format t "Foo: ~a, Bar: ~a~%" foo bar))
    ("Foo: (\\w+)$" (foo)
      (format t "Foo: ~a.~%" foo))
    (otherwise (format t "Didn't match.~%"))))

(test "asd 23-234 qwe")
; Foo: 23, Bar: 234
(test "Foo: Foobar")
; Foo: Foobar.
(test "Foo: 43 - 23")
; Didn't match.

DEFINE-FOO,DEFFOO

定义事物的宏通常用DEFINE-或DEF-prefix命名。

从标准的例子:DEFUN,DEFMACRO,DEFINE-CONDITION。

 类似资料:
  • 本文向大家介绍common-lisp 照应宏,包括了common-lisp 照应宏的使用技巧和注意事项,需要的朋友参考一下 示例 照应宏是一种引入变量(通常为IT)的宏,该变量捕获用户提供的表单的结果。一个常见的示例是Anaphoric If,它与regular一样IF,但也定义了变量IT以引用测试表单的结果。            

  • 这一页列出了Strom topologies(拓扑)中的各种常见模式。 Batching BasicBolt In-memory caching + fields grouping combo (内存缓存+字段分组组合) Streaming top N TimeCacheMap for efficiently keeping a cache of things that have been rec

  • 本文向大家介绍common-lisp 反引号-为宏编写代码模板,包括了common-lisp 反引号-为宏编写代码模板的使用技巧和注意事项,需要的朋友参考一下 示例 宏返回代码。由于Lisp中的代码由列表组成,因此可以使用常规列表操作功能来生成它。 这通常很难阅读,尤其是在较长的宏中。Backquote阅读器宏允许编写通过选择性评估元素填充的引用模板。 这个版本看起来几乎像常规代码。逗号用于评估F

  • Common Lisp Koans(lisp-koans)是一个语言学习练习程序,类似 ruby koans,python koans 等等。Common Lisp Koans 主要是帮助学习一些 lisp 规范特性和改进,可以学习到大量的 Common Lisp 语言特性。 终端,在文件 'contemplate.lsp' 执行 lisp 解析器: sbcl --script contempla

  • Steel Bank Common Lisp (SBCL) 源自于 CMUCL, 是一种高性能的Common Lisp编译器。它是开源/免费软件,采用自由许可。除了ANSI Common Lisp的编译器和运行系统,它提供了一个交互的运行环境,包括一个调试器,统计分析器,一个代码覆盖工具,以及许多其他的扩展。 SBCL 可运行于许多 POSIX 平台上,Windows 上现为试验阶段。 

  • 本文向大家介绍common-lisp True 和 False,包括了common-lisp True 和 False的使用技巧和注意事项,需要的朋友参考一下 示例 特殊符号T表示Common Lisp中的值true,而特殊符号NIL表示false: 在标准中,它们被称为“常量变量”(sic!),因为它们是无法修改其值的变量。因此,您不能将它们的名称用于普通变量,如以下不正确的示例所示: 实际上,