什麼是"正確"及"不正確"?

 在寫壓力容器計算的程式時,有一段法規上說。在判斷最小厚度時,有以下.....。

其中在非致死性作業下,... 熱交換器的換熱管 (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))

 在判別屬性值是否為真,或者為否。在壓力容器設計程式中需要確定,出報告時才不會有文不對題的情況發生。 

對於工具程式相關議題討論,可以留言大家一塊研究。


各申機械設計工作室; Each Application Mechanical Design Studio

壓力容器設計 各申機械設計工作室

留言