リストを出力する関数を書きたいです。この関数はリストを取得し、新しいリストを出力します。例えば:
(0 0 1 2 2 1) -> (3 4 4 5 5 6)).
それが何をするか: 初期リストの index+1 は、新しいリストの値です。そして、その値は、初期リストの値に応じて、新しいリストに x 回配置されます。
(1 2) -> (1 2 2)
(0 3 0 3) -> (2 2 2 4 4 4)
したがって、3 は 2 番目の位置にあり、値は 3 であるため、2 (2 番目の位置) は新しいリストに 3 回配置されます。
私はこれを思いついたが、うまくいかない
(defun change-list (list)
(setq newlist '(1 2 3))
(setq i 0)
(while (<= i (length list))
(if (= (nth i list) 0)
(concatenate 'list '0 'newlist)
(concatenate 'list '(i) 'newlist))
(+ i 1)
(remove 0 newlist)))
問題は主に、新しい変数を認識しないことです。次のエラーが表示されました: functions.lisp:27:26: warning: Undefined function referenced: while
functions.lisp:31:2: 警告: 宣言されていない変数 newlist への自由な参照は特別なものと見なされます。警告: 宣言されていない変数への自由な参照 i は特別であると想定しました。
これを理解している人はいますか?
私たちはそれを自分で解決することができました:
(defun change-list (a)
(loop for j from 1 to (length a) by 1 append
(loop for i from 1 to (nth (- j 1) a) by 1
collect j )))
それはより大きな課題の一部であり、Lisp についてあまり教育を受けていませんでした。