私はフォームのCommonLispに次のようなリストのリストを持っています
((1 2) (3 4) (5 6))
これは変数の値であり、list
値がリストの要素である3つの新しい変数が必要です。例えば:
list-1 (1 2)
list-2 (3 4)
list-3 (5 6)
この操作を行う機能はありますか?
私はフォームのCommonLispに次のようなリストのリストを持っています
((1 2) (3 4) (5 6))
これは変数の値であり、list
値がリストの要素である3つの新しい変数が必要です。例えば:
list-1 (1 2)
list-2 (3 4)
list-3 (5 6)
この操作を行う機能はありますか?
setq
、first
(またはnth
およびelt
)を使用して設定します:
(setq list-1 (first list)
list-2 (second list)
list-3 (third list))
またはバインドdestructuring-bind
する:
(destructuring-bind (list-1 list-2 list-3) list
...)
繰り返しますが、変数を割り当てるのではなくdestructuring-bind
バインドします(つまり、のようではなく、のようになります)。let
setq
リストの要素をフォームの名前にバインドするという概念はlist-#
一般化できます。
序数のリスト名を引数として、指定された本文を使用してラムダを生成する関数を作成できます。
(defun make-list-lambda (n body)
(let ((list-names (loop for index from 1 to n
collect (intern (format nil "LIST-~D" index)))))
`(lambda ,list-names
(declare (ignorable ,@list-names))
,@body)))
次に、マクロを作成してラムダを作成し、コンパイルして、リストに適用します。
(defmacro letlist (list &body body)
(let ((assignments (gensym)))
`(let ((,assignments ,list))
(apply (compile nil (make-list-lambda (length ,assignments) ',body))
,assignments))))
このようにして、割り当てはラムダ本体にローカライズされます。
CL-USER> (letlist '(a b c d e f)
(format t "list-1: ~A~%" list-1)
(format t "list-3: ~A~%" list-3))
list-1: A
list-3: C
NIL
注:list-#
リストが表示されるまで、存在する引数の数がわからないため、マクロが呼び出されるたびにフォームがコンパイルされます。
まず、リストを変数、たとえばmylistに設定します。次に、関数形式を使用して必要な出力を吐き出します。CLISPを使用しています。お役に立てれば。これは実際のREPL出力です。
(setf mylist '((1 2) (3 4) (5 6)) )
((1 2)(3 4)(5 6))
(format t "list-1 ~d~%list-2 ~d~%list-3 ~d" (car mylist)
(2番目のmylist)(最後のmylist))list-1(1 2)list-2(3 4)list-3((5 6))NIL[142]>誰かが「NIL」を取り除く方法を教えてもらえますか上記の出力?私はLispに不慣れです。ただ楽しみのために学んでいます。