文字列から式を組み立てる - lisp-cookbook-ja/common-lisp GitHub Wiki
多くはありませんが、リスト等から式を組み立てるより、文字列表現から式を組み立てる方が手軽な場合があります。
但し余計な中間データが発生しますので、リード時読み取りと組み合わせて定数の設定に使う等、使う場所を選ぶ必要があるでしょう。
(defvar *bit-vectors*
`#(,@(loop :for i :from #b00000 :to #b11111
:collect (read-from-string (format nil "#*~5,'0B" i)))))
*bit-vectors*
;=> #(#*00000 #*00001 #*00010 #*00011 #*00100 #*00101 #*00110
#*00111 #*01000 #*01001 #*01010 #*01011 #*01100 #*01101
#*01110 #*01111 #*10000 #*10001 #*10010 #*10011 #*10100
#*10101 #*10110 #*10111 #*11000 #*11001 #*11010 #*11011
#*11100 #*11101 #*11110 #*11111)
参考: 文字列を経由しない場合
(defun integer->bit-vector (n fig)
(let* ((bv (make-sequence 'bit-vector fig))
(len (length bv)))
(dotimes (i len)
(setf (aref bv (- len i 1))
(ldb (byte 1 i) n)))
bv))
`#(,@(loop :for i :from #b00000 :to #b11111 :collect (integer->bit-vector i 5)))
;=> #(#*00000 #*00001 #*00010 #*00011 #*00100 #*00101 #*00110
#*00111 #*01000 #*01001 #*01010 #*01011 #*01100 #*01101
#*01110 #*01111 #*10000 #*10001 #*10010 #*10011 #*10100
#*10101 #*10110 #*10111 #*11000 #*11001 #*11010 #*11011
#*11100 #*11101 #*11110 #*11111)