文字列から式を組み立てる - 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)