在 Common Lisp 中通过 defmacro 来实现别名(或称为缩略语)
--全部参考自《On Lisp》的16章
;; 开始
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; long-short-s 用到一个名为 group 的函数,定义如下
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun group (source n)
(if (zerop n) (error "zero length"))
(labels ((rec (source acc)
(let ((rest (nthcdr n source)))
(if (consp rest)
(rec rest (cons (subseq source 0 n) acc))
(nreverse (cons source acc))))))
(if source (rec source nil) nil)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 单个定义别名
;; 用法为: (long-short short-name very-very-very-very-very-very-long-name)
;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro long-short (short-name long-name)
`(defmacro ,short-name (&rest args)
`(,',long-name ,@args)))
;; 注意最后一行 `(,',long-name ,@args)))
;; 第一个符号是反引号,第二个类似符号是单引号,千万不要搞错,否则会出现编译错误
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 批量定义别名
;; 用法为: (long-short-s short-name1 long-name1
;; short-name2 long-name2
;; short-name3 long-name3)
;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro long-short-s (&rest names)
`(progn
,@(mapcar #'(lambda (pair)
`(long-short ,@pair))
(group names 2))))
;; 结束