我正在从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)