小编nis*_*gao的帖子

如何在Common Lisp中编写类似的函数?

我正在从Practical Common Lisp学习Common Lisp.它有一个辅助函数的例子,用于在第24章中读取和写入二进制文件.这是一个例子:

(defun read-u2 (in)
  (+ (* (read-byte in) 256) (read-byte in)))
Run Code Online (Sandbox Code Playgroud)

我也可以编写用于读取其他类型二进制数的函数.但我认为这样做违反了DRY原则.此外,这些函数将是类似的,所以我尝试用宏生成函数.

(defmacro make-read (n be)
  `(defun ,(intern (format nil "READ~d~:[L~;B~]E" n be))
       (&optional (stream *standard-input*))
     (logior ,@(loop for i from 0 below n collect
                `(ash (read-byte stream)
                      ,(* 8 (if be (- n 1 i) i)))))))

(defmacro make-read-s (n be)
  `(defun ,(intern (format nil "READ~d~:[L~;B~]E-S" n be))
       (&optional (stream *standard-input*))
     (let ((a (,(intern (format nil "READ~d~:[L~;B~]E" n be)) stream)))
       (if (zerop (logand …
Run Code Online (Sandbox Code Playgroud)

preprocessor dry common-lisp

8
推荐指数
1
解决办法
209
查看次数

标签 统计

common-lisp ×1

dry ×1

preprocessor ×1