小编Dan*_*ski的帖子

在Common Lisp中定义多个后端的惯用方法?

我想用多用户界面后端(例如文本和图形)编写代码,因此它们很容易切换.我的方法是使用CLOS:

(defgeneric draw-user-interface (argument ui)
  (:documentation "Present the user interface")
  (:method (argument (ui (eql :tui)))
    (format t "Textual user interface! (~A)" argument))
  (:method (argument (ui (eql :gui)))
    (format t "Graphical user interface! (~A)" argument)))
Run Code Online (Sandbox Code Playgroud)

这种方法乍一看似乎没问题,但它有一些缺点.为了简化调用,我定义了将在每个函数调用中使用的参数ui-type,以简化后端的切换,但是在使用高阶函数时会导致问题:

(defparameter *ui-type* :tui
  "Preferred user interface type")

(draw-user-interface 3 *ui-type*)

;;; I can't use the following due to the `ui' argument:
;(mapcar #'draw-user-interface '(1 2 3))

;;; Instead I have to write this
(mapcar #'(lambda (arg)
            (draw-user-interface arg *ui-type*))
        '(1 2 3))

;; …
Run Code Online (Sandbox Code Playgroud)

common-lisp clos

3
推荐指数
2
解决办法
214
查看次数

标签 统计

clos ×1

common-lisp ×1