AutoCAD顧問
還沒有註冊嗎...即日起免費註冊,所有最完整的AutoCAD討論、教學及資源都在論壇裡喔~

[已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

上一篇主題 下一篇主題 向下

[已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 RyanGuo 于 2013-08-08, 10:18

之前在網路上似乎看過有種函數類似於AND還有OR,
但是有了結論就不繼續往下算的.

舉例來說
(AND A B C)
如果是A或B為nil,
回傳值必定為nil的情況下,
程式還是會去算C是不是Ture,
而印象中有種類似於AND的函數是不會去算C的.

其實不太確定Lisp到底有沒有這種函數,
只是印象中有,...
但就是沒找到愛哭


RyanGuo 在 2013-08-19, 01:41 作了第 1 次修改
avatar
RyanGuo
初級會員
初級會員

文章總數 : 206
年齡 : 34
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 2960
威望值 : 303
注冊日期 : 2013-04-18
男 射手座 狗

回頂端 向下

回復: [已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 shenhung 于 2013-08-16, 14:23

(AND A B C) 的簡單說法就是 A B C 3個條件式.都成立 為T 才會繼續執行你要的程式
即然 A or B 都為nil 條件式不成立. C 是不是為T 都不重要了.!! 因為程式.就不會繼續執行你的程式.!!

坦白說.我是不太了解你要運用的地方.在那.!! 建議你可以將你預計想寫的程式.完整運作概念寫出來..別人比較有辦法幫你.
或是 類似你目前的問題 and 或 or 你的局部代碼貼出來..問題會比較清楚.!!

很多時候.你的貼文.得不到回應.是因為別人有可能看不懂你想表達的.!!

avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5006
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 RyanGuo 于 2013-08-19, 01:32

嗯,原來如此,
抱歉~"~
原來是我搞錯and和or的運算方式了Orz...

我想提問的是這樣的,
延續(AND A B C)的例子,
其中的A、B、C是比較簡單一點參數,
所以看起來沒有差異性,
但如果是(AND (A a1) (B b1) (C c1)),
其中(A a1) (B b1) (C c1)是副程式計算,
那這樣的話不管(A a1) (B b1)的計算結果如何,
(C c1)還是會執行,
在相較於不計算(C c1)的情況下會多出了一些計算的時間,
我所要提問的是,
有沒有在已經確定(C c1)不會影響結果的情況下,
自動跳過(C c1)的and或是or.

會有這樣的問題,
我想大概是在網路查資料時,
把其他程式語言的and和or和autolisp的and和or弄混了Orz....

要用程式來看的話,
用下面的簡單程式可以看出差異.

(print "cc")不會被執行
代碼:
(defun c:tt ()
  (defun a (xx)
    (setq xx 1)
  )

  (defun b (xx)
    (setq xx 1)
  )

  (defun c (xx)
    (print "cc")
    (setq xx 1)
  )

  (and (eq (a 1) 1) (eq (b 1) 2) (eq (c 1) 1))
)
(print "cc")會被執行
代碼:
(defun c:tt ()
  (defun a (xx)
    (setq xx 1)
  )

  (defun b (xx)
    (setq xx 1)
  )

  (defun c (xx)
    (print "cc")
    (setq xx 1)
  )

  (and (eq (a 1) 1) (eq (b 1) 1) (eq (c 1) 1))
)
avatar
RyanGuo
初級會員
初級會員

文章總數 : 206
年齡 : 34
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 2960
威望值 : 303
注冊日期 : 2013-04-18
男 射手座 狗

回頂端 向下

回復: [已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 shenhung 于 2013-08-19, 02:37

因為你的 (AND A B C) 是放一起做為條件式. 所以他們會同時檢查.
可以將A B C 拆開. 確定A和B 都為T 再檢查C . C為T  才PRINC "CC"

(if (and (eq (a 1) 1) (eq (b 1) 1)) ; A或B 都為T 才會執行 (eq (c 1) 1) 反之就會跳過這段檢查.
  (IF  (eq (c 1) 1)
    (PRINT "CC")
  )
)

Tiger&蘋果爸 寫到:讚啦!! 謝謝熱心回覆~< 積分 +1>
[公告]關於團隊成員的回文及貢獻
avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5006
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 RyanGuo 于 2013-08-19, 03:58

我想我不只表達能力欠佳,
同時還會誤導別人Orz...

事實上autolisp的and或是or,
已經具備了我想要的功能,
在我舉的程式範例中,
第一個是不會執行(PRINT "CC")的,
也就是說程式不會執行(eq (c 1) 1),
因為程式算到(eq (b 1) 2)後就終止了and的計算.

現在回憶起之前查資料時看到的內容,
那一篇是在說,
如果副程式c中有必須要執行的內容,
則需要注意and是怎樣運作的,
回到我舉的例子,
如果(PRINT "CC")是一段必須執行的內容,
那麼在我舉的不會執行(PRINT "CC")的例子就是錯誤的使用,
因為它只有在前面的(eq (a 1) 1) (eq (b 1) 2)都成立時才會被執行.
而會執行(PRINT "CC")的例子就只是碰巧會執行出正確結果的錯誤的使用,
正確的寫法應該是(and (eq (c 1) 1) (eq (a 1) 1) (eq (b 1) 1)),
讓(eq (c 1) 1)優先計算.

但如果副程式c和副程式a都有必須執行的內容,
則要使用不管計算過程中是否已得到了不會改變最終結果的答案,
都會把所有條件跑完的and或是or,
至於autolisp中是否有這樣的and或是or已經超出了我原本想要問的範疇之內.
avatar
RyanGuo
初級會員
初級會員

文章總數 : 206
年齡 : 34
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 2960
威望值 : 303
注冊日期 : 2013-04-18
男 射手座 狗

回頂端 向下

回復: [已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 shenhung 于 2013-08-19, 11:19

and 和or 在很多程式裡面的概念都是相同的 .LISP的 AND 和 OR 並沒有不同.
and = 條件式.全部成立 .才會執行你要的程式.
or = 條件式 .只要有1個成立. 就會執行你要的程式.
你提的A B C 3個條件式.的優先順序.取決於程式運作流程.

通常函數的討論是比較不容理解.也不好表達.!! 因為提的例子大多是假設狀況.
所以我才會說.貼出你真的你要開發的程式..會好理解的多.
也許別人有開發的經驗.也比較好提供你意見.


avatar
shenhung
高級會員
高級會員

文章總數 : 238
年齡 : 50
來自 : 新北市
職業 : 塑膠模具設計.AUTOLISP
愛好 : 音樂
個性 : 隨和
使用年資 : 18年
使用版本 : 2010
積分 : 15
經驗值 : 5006
威望值 : 913
注冊日期 : 2009-06-03
男 摩羯座 馬

回頂端 向下

回復: [已解決]AutoLISP是否有函數類似於AND/OR,但有結論就不繼續算的

發表 由 RyanGuo 于 2013-08-20, 01:55

很抱歉,
其實不是不貼出,
而是最近嘗試編寫的程式是一改再改,
每次更動的幅度都蠻大的,
而我並沒有將每個階段更改前的內容備份,
時過變遷,
實在是已經忘記當時所編寫的詳細程式內容為何,
還請見諒.

但還能記得的是之所以會有這樣的提問,
是誤認為autolisp的and或or不具有"有結論就不繼續算的"的功能,
而我當時的判斷式if的and(或是or)中有三個值要去判斷,
其中一個或兩個數值是副程式的運算結果,
而我期望的是能不跳入副程式進行運算是最好,
雖然對電腦來說增加的時間只不過是連1秒都不到的時間,
但總覺得說程式要寫就要寫到最佳化,
所以才想要詢問,
如今想想當時沒有先利用程式探討and或是or的運算過程真是一大失算,
明明autolisp的and或or具有"有結論就不繼續算的"的功能,
還要去追求其他類似的函數,
不免覺得自己是分明有工具可用,
而不去用的感覺....
這種感覺真的不太好Orz....

[追加內容]
剛剛寫程式時發現到不錯用的用法,
因為我程式中的getxxx有可能是點座標或徑度,
一開始只用下面這程式來判斷兩點間的長度是否為0,
代碼:
(= (distance P1 getxxx) 0)
當getxxx為徑度時,程式就掛了,
改成下面這樣就OK了,
代碼:
(AND (EQ (TYPE getxxx) 'LIST) (= (distance P1 getxxx) 0))
因為只有在getxxx為點座標的時候會繼續往下算,
所以也就不怕資料型態不正確而出錯;)


RyanGuo 在 2013-09-11, 10:10 作了第 1 次修改 (原因 : [追加內容])
avatar
RyanGuo
初級會員
初級會員

文章總數 : 206
年齡 : 34
來自 : 屏東
職業 : 機械繪圖
愛好 : 玩遊戲
個性 : 嗚嗚男
使用年資 : 1年多
使用版本 : 2011
積分 : 3
經驗值 : 2960
威望值 : 303
注冊日期 : 2013-04-18
男 射手座 狗

回頂端 向下

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章