aud*_*row 0 lisp oop class common-lisp clos
我想知道如何存储单个变量并在该变量上具有特定的功能.我想知道是否有创建课程的替代方案.
具体来说,我正在创建一个应用程序,其中我存储一个时间值,表示从基准时间(例如,2000年1月1日,00:00:00)开始经过的秒数.我想对此值执行操作,例如将其从秒转换为特定时间或日期,或从日期转换为特定秒.
我用一个班级做了这个,但看起来很浪费.具体来说,我每次访问存储的值秒的时间过去,将类似于(time-time time)其中time-time对于时间点的访问time.
有没有更好的方法来设计它,也许没有类?
存取器名称
您可以按照自己喜欢的方式在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
Run Code Online (Sandbox Code Playgroud)
通过访问器功能更短地访问插槽
Common Lisp也有一个表单WITH-ACCESSORS.它允许我们在代码中使用符号而不是访问器形式 - 对于某个CLOS对象.在下面的示例中,我们可以使用secs它看起来像代码中的变量,但Common Lisp将确保它实际上调用了访问器seconds.我们可以写secs而不是(seconds mt).因此,它有助于缩短封闭的代码.将下一个示例与上面的代码进行比较.
CL-USER 25 > (let ((mt (make-instance 'mytime :seconds 200)))
(with-accessors ((secs seconds))
mt
(values secs (truncate secs 60))))
200
3
Run Code Online (Sandbox Code Playgroud)
通过更短的时间访问插槽 SLOT-VALUE
CLOS也有WITH-SLOTS对通过插槽名称,这里命名插槽插槽接入seconds的的mytime实例可以通过名称来访问secs:
CL-USER 26 > (let ((mt (make-instance 'mytime :seconds 200)))
(with-slots ((secs seconds))
mt
(values secs (truncate secs 60))))
200
3
Run Code Online (Sandbox Code Playgroud)