0

コードの問題は次のとおりです。

    (foreach n l_pt
        (write-line
            (strcat "sommet" str_sep
                (itoa (setq (nbs (+1 nbs )))) str_sep
                (rtos (car n) 2 2) str_sep
                (rtos (cadr n) 2 2) str_sep
                (strcat "2") str_sep
                (strcat "borne")
            )
            f_open
        )
    )
    ;;(write-line "" f_open)

出力に次のようなファイルがあります。

ソメット;;

タイプ;数値;X;Y;精度;性質

sommet;1;1532292.16;3214140.11;2;borne

sommet;2;1532287.08;3214140.60;2;borne

ソメット;1;1532291.45;3214136.43;2;負担

ソメット;2;1532286.50;3214135.87;2;負担

sommet;1;1532287.08;3214140.60;2;borne

ご想像のとおり、問題のある部分は、意図したとおりに機能せず、増加している「Num」です。

次の行であることは理解しました: " (itoa (setq (nbs (+1 nbs )))) str_se" が意図したとおりに機能していませんが、その理由はわかりません。(setq (nbs (+ 1 nbs))) に切り替えようとしましたが、どちらも機能しません。

それがどこから来ているのか、何かアイデアはありますか?

完全なコード

4

2 に答える 2

1

問題は、括弧が1つずれていることだと思います。nbsまたは、繰り返しの外で初期化する必要があること。それは、どのように機能させたいかによって異なります。

あなたのコード(非常に単純化された)は次のようです:

;; Stuff before the problem
(repeat (sslength js)
    ;; (setq....)
    (setq nbs 0)
    ;;; Lots of stuff
    (foreach n l_pt
        ;; The printing code including...
        (setq nbs (+ 1 nbs))
    )
)

ご覧のとおり、ループを通過するたびに設定nbsし、後で追加しています。0repeat1

これらのループを分離したかったようです-repeat情報の計算が終了するまで、foreachリスト全体を印刷しますl_pt

l_pt現状では、大きなループを介して毎回1行の情報を追加し、ステートメントrepeatからその1つの項目のみを印刷していると思います。foreach

括弧を移動すると、次のようになります。

(repeat (sslength js)
    ;;...
    (setq nbs 0)
    ;;...
)
(foreach n l_pt
    ;;...
    (setq nbs (+ 1 nbs))
)

(setq nbs 0)繰り返しループの外側に配置することもできます。あなたが何をしているのかが明確になり、5回以上初期化する必要がないように、どちらの方法でもおそらく最善です...

また、これは、変数の割り当てを明確に分離することをお勧めする理由を示しています。(setq長い) ステートメントの最後で失われる可能性があります。

;; Do this,
(setq sentence "This is one or more variable assignments."
      number 200)

;; or this,
(setq sentence "This is one or more variable assignments.")
(setq number 200)

;; not this.
(setq sentence "This is one or more variable assignments." number 200)

とにかく、これらのオプションのいずれかで、カウンターがnbs再び機能するはずです。

それが役立つことを願っています!

PS 上記のコメントでの (+1 nbs) の議論を助けるために、以下はすべて正しく、AutoLISP で同等です。

(+ 1 nbs)
(+ nbs 1)         ;; Order is not important for addition
(+ nbs 1 0 0 0)   ;; Any number of values can be added
(1+ nbs)          ;; The typical way to increment a value
                  ;; (1+ is a function that returns the value + 1)
于 2016-07-27T02:02:06.483 に答える
0

これはAutoLISP特有のものに違いありません。私がそう言っているのは、このコードが (後で見るようにCommon Lispに適応している)

(defun foo (l_pt)
  (let ((str_sep ";")
        (nbs 0))

    (mapcar #'(lambda (n) (write-line (strcat (list "sommet" str_sep
                                                    (itoa (setq nbs (+ 1 nbs))) str_sep
                                                    (rtos (car n) 2 2) str_sep
                                                    (rtos (cadr n) 2 2) str_sep
                                                    (strcat "2") str_sep
                                                    (strcat "borne")))
                                      ))
            l_pt)))

(defun rtos (a b c) (strcat a))

(defun strcat (string-designators)
  (with-output-to-string (strcat)
    (cond ((listp string-designators)
           (mapcar #'(lambda (s) (princ s strcat)) string-designators))
          (t (princ string-designators strcat)))))

(defun itoa (i) (write-to-string i))

この式の場合:

(foo '((x y) (a b) (aa bb)))

次の出力が生成されます。

sommet;1;X;Y;2;borne
sommet;2;A;B;2;borne
sommet;3;AA;BB;2;borne

確かに、Common Lisp にはない AutoLISP の要素に対応するために、多くのことを変更しなければなりませんでした。おそらく最も重要なのは、foreach に相当するものを作成しなかったことです (なぜなら、その特異性を複製するかどうかを知る方法がないからです)。 )、それでも少なくともsetq期待どおりに動作しているように見えます。

于 2016-07-17T18:01:30.097 に答える