在寫壓力容器計算的程式時,有一段法規上說。在判斷最小厚度時,有以下.....。
其中在非致死性作業下,... 熱交換器的換熱管 (tube) 可不受最小厚度 1.5 mm的限制的規定。
怎麼在程式中表示"非"致死性呢?我直覺就想到。如果一個承壓件在其屬性中表示,它是非致死性作業。
(let ((hash1 (make-hash-table)))
(setf (gethash 'is-lethal-service hash1) nil)
hash1)
其中要如何判斷它是否為真,或是"正確"一般的作法是
(let ((hash1 (make-hash-table)))
.
.
.
(if (equal (gethash 'is-lethal-service hash1) t)
(print t)
(print nil)))
但是 (gethash 'is-lethal-service hash1) 取回的值為多值。所以它傳回 T T 二個數值,第一個是屬產的值 'T ,第二個值為表示 'is-lethal-service 在 hash1 這個雜湊表中有此鍵值。那如果在 hash1 的雜湊表中沒有這個鍵值,即沒 'is-lethal-service 這個 key ;它回傳值就變成 nil nil 了。所以在使用雜湊表儲存屬性值時,要先確認它在雜湊表中是否有鍵值,再來判別其屬性值為何。
一般 common lisp 程式除了 nil 之外都是真值。而使用雜湊儲存資料時會造成以上的困擾。所以在使用上我設定了判斷壓力容器參數真值的判斷程式。
;; 以下為確認"正"
(defun true-p (obj)
(if (or (equal obj t)
(equal obj "t")
(equal obj "T")
(equal obj "TRUE")
(equal obj "true")
(equal obj "True")
(equal obj "Yes")
(equal obj "yes")
(equal obj "YES"))
t
nil))
;; 以下為確認"負"
(defun false-p (obj)
(if (or (equal obj nil)
(equal obj "NO")
(equal obj "No")
(equal obj "no")
(equal obj "FALSE")
(equal obj "False")
(equal obj "flase")
(equal obj "F")
(equal obj "f"))
t
nil))
在判別屬性值是否為真,或者為否。在壓力容器設計程式中需要確定,出報告時才不會有文不對題的情況發生。
對於工具程式相關議題討論,可以留言大家一塊研究。
沒有留言:
張貼留言