1

私はフォームのCommonLispに次のようなリストのリストを持っています

((1 2) (3 4) (5 6)) 

これは変数の値であり、list値がリストの要素である3つの新しい変数が必要です。例えば:

list-1 (1 2)
list-2 (3 4)
list-3 (5 6)

この操作を行う機能はありますか?

4

3 に答える 3

10

setqfirst(または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 バインドします(つまり、のようではなく、のようになります)。letsetq

于 2012-12-31T18:44:10.043 に答える
2

リストの要素をフォームの名前にバインドするという概念は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-#リストが表示されるまで、存在する引数の数がわからないため、マクロが呼び出されるたびにフォームがコンパイルされます。

于 2013-01-02T07:01:49.313 に答える
-1

まず、リストを変数、たとえば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に不慣れです。ただ楽しみのために学んでいます。

于 2013-11-30T19:21:10.027 に答える