在 Common Lisp 中通过 defmacro 来实现别名(或称为缩略语)

在 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))))
;; 结束

 

你可能感兴趣的:(lisp,别名,缩略语,defmacro)