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

 

转载于:https://my.oschina.net/freeblues/blog/89500

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值