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;精度;性质

索梅特;1;1532292.16;3214140.11;2;承担

sommet;2;1532287.08;3214140.60;2;承担

索梅特;1;1532291.45;3214136.43;2;承担

sommet;2;1532286.50;3214135.87;2;承担

索梅特;1;1532287.08;3214140.60;2;承担

正如您猜到的那样,有问题的部分是“Num”,它没有按预期工作,正在递增。

我知道这是这一行:“ (itoa (setq (nbs (+1 nbs )))) str_se” 没有按预期工作,但我不知道为什么。我尝试将其切换为 (setq (nbs (+ 1 nbs))),但它也不起作用。

你有什么想法吗?

完整代码

4

2 回答 2

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每次通过大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

诚然,我不得不改变很多东西以适应 AutoLISP 中不在 Common Lisp 中的元素,其中最重要的可能是我没有编写与 foreach 等效的东西(因为无法知道我会复制它的特质),但至少看起来setq它正在做你期望的事情。

于 2016-07-17T18:01:30.097 回答