訪問者的名字
您可以命名在CLOS存取你喜歡的任何方式。存取函數可以被稱爲seconds
:
CL-USER 23 > (defclass mytime()
((seconds :accessor seconds :initarg :seconds)))
#<STANDARD-CLASS MYTIME 422015CDD3>
CL-USER 24 > (let ((mt (make-instance 'mytime :seconds 100)))
(values (seconds mt)
(truncate (seconds mt) 60)))
100
1
通過縮短存取函數
的Common Lisp也有一個形式WITH-ACCESSORS
訪問插槽。它允許我們在代碼中使用符號而不是訪問者形式 - 對於某個CLOS對象。在以下示例中,我們可以使用secs
,它看起來像代碼中的變量,但Common Lisp將確保它實際上調用訪問器seconds
。我們可以寫secs
而不是(seconds mt)
。因此它有助於縮短包含的代碼。比較下面的例子和上面的代碼。
:通過
SLOT-VALUE
CLOS到插槽
CL-USER 25 > (let ((mt (make-instance 'mytime :seconds 200)))
(with-accessors ((secs seconds))
mt
(values secs (truncate secs 60))))
200
3
較短的訪問也有WITH-SLOTS
爲通過槽名插槽存取,這裏命名爲mytime
實例seconds
插槽,可以通過名字secs
訪問
CL-USER 26 > (let ((mt (make-instance 'mytime :seconds 200))) (with-slots ((secs seconds)) mt (values secs (truncate secs 60)))) 200 3
爲什麼不把它作爲一個整數存儲? – jkiiski
需要說明的是,您不想使用作爲標準一部分的[通用時間函數](http://www.lispworks.com/documentation/HyperSpec/Body/f_get_un.htm)? –
按照頻率的順序,你用它做什麼?這是特定的時間,還是自抵消後的時間過去了? – Sylwester