【问题标题】:Equivalent of WAR file in Common LispCommon Lisp 中 WAR 文件的等价物
【发布时间】:2015-02-09 00:02:26
【问题描述】:

我有一个用 Lisp 编写的运行状态机的系统。我想从目录中动态加载状态机的定义和任何所需的资产(图像等),只要给定目录的名称。会有多个不同的状态机。这与 Apache 加载和运行 WAR 文件类似,但并不完全相同。

我担心的是,简单地编译和加载文件可以运行任何东西。理想情况下,我只想获取状态机定义,使用资产路径对其进行配置,并使其可用于执行。现在我正在加载一个实现特定基类的类,但这并不简单。对此有标准技术吗?

谢谢。

【问题讨论】:

  • 加载和运行 WAR 文件真的不能运行吗?

标签: lisp common-lisp


【解决方案1】:

您是说您担心读取文件会导致任意代码执行的可能性吗?所以你应该考虑重新定义读取表以排除不需要的符号。

例如结帐this,查找“SAFE-READ-FROM-STRING”。

它不完整,但您可以使用 #'read 获取数据结构,进行一些完整性检查并在需要时进行编译。

如果这不是您想要的,那么我很抱歉,您能否进一步解释您在寻找什么?

【讨论】:

  • 我认为您的链接没有到达您想要的位置。
  • 感谢指向安全读取字符串的指针。这可能是解决方案的一部分。我想我必须实现我自己的动态加载方法,该方法查找一个类,该类是一个已知类的子类型并公开用户特定的状态机定义。
【解决方案2】:

如果您想在不执行任意代码的情况下读取状态机的定义,您可以考虑以下宏:

(defmacro def-state-machine (name (&rest assets) &rest states)
  `(defparameter ,name
     (list
       :assets ',(remove-if-not #'legal-asset? assets)
       :states ',(remove-if-not #'legal-state? states))))

这将创建有效资产和状态的列表(因为我不知道你的机器是什么样子,所以我在这里放了一些抽象谓词 - 它们可能会检查合法语法,或者参数是否属于某种类型,或者如果资产或状态是非法的,则抛出错误)。

假设,你还需要定义一些函数来运行机器:

(defmacro def-transition (name args &body body)
  `(defun ,name (,@args)
     ,@body))

用于定义函数的单独宏允许额外的健全性检查。最后,你可以定义 reader 函数:

(defun load-toy-state-machine (directory)
  (let ((path (cl-fad:merge-pathnames-as-file directory #P"machine.lisp"))
        ;(*readtable* (copy-readtable nil))
       )
    ; (make-dispatch-macro-character #\#)
    (with-open-file (stream path :direction :input)
      (do ((form (read stream nil 'done)
                 (read stream nil 'done)))
          ((eql form 'done) T)
        (if (member (car form) '(def-state-machine def-transition))
            (eval form)
            (error "malformed state machine definition file"))))))

这将只评估允许的宏(def-state-machine 和 def-transition),它们具有固定的语法,并且可能包含额外的健全性检查。这些都不执行代码。

【讨论】:

  • 不,它没有。如果要禁用阅读器宏,则需要修改 readtable.我在 load-toy-state-machine 中添加了注释,未注释的任何遇到的 #\# 都会引发错误。
  • 好主意,谢谢!我可能会将这些合并到我的解决方案中,因为似乎没有任何东西已经存在。感谢您的宝贵时间。
  • 很高兴能帮上忙 :-)
猜你喜欢
  • 2016-06-16
  • 2021-09-13
  • 1970-01-01
  • 2010-10-09
  • 2016-08-25
  • 2011-05-16
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多