最近我阅读了很多关于 强化学习 的资料,发现 “强化学习:导论” 是一本极好的指南。作者很乐意地提供了很多他们使用的示例的 源代码。
在开始提问之前,我应该指出我对 Lisp 的实践知识非常少。我了解基本概念和工作原理,但我从未真正以有意义的方式使用过 Lisp,所以很可能我只是在做一些非常新手的事情。
此外,作者在他的页面上声明他不会回答关于他的代码的问题,所以我没有联系他,并认为 Stack Overflow 会是一个更好的选择。
我一直在尝试在一台 Linux 机器上运行代码,使用 GNU 的 CLISP 和 SBCL,但都无法运行。 使用任何一个解释器都会出现一长串错误。 特别是,大多数代码似乎使用了 ‘utilities.lisp’ 文件中包含的许多实用程序,该文件包含以下行:
(defpackage :rss-utilities
(:use :common-lisp :ccl)
(:nicknames :ut))
(in-package :ut)
:ccl 似乎指的是某种基于 Mac 的 Lisp 版本,但我无法证实这一点,它可能只是另一个代码包。
> * (load "utilities.lisp")
>
> debugger invoked on a
> SB-KERNEL:SIMPLE-PACKAGE-ERROR in
> thread #<THREAD "initial thread"
> RUNNING {100266AC51}>: The name
> "CCL" does not designate any package.
>
> Type HELP for debugger help, or
> (SB-EXT:QUIT) to exit from SBCL.
>
> restarts (invokable by number or by
> possibly-abbreviated name): 0:
> [ABORT] Exit debugger, returning to
> top level.
>
> (SB-INT:%FIND-PACKAGE-OR-LOSE "CCL")
我尝试删除这个特定的部分(将该行更改为
(:use :common-lisp)
但这只会产生更多的错误。
> ; in: LAMBDA NIL ; (+
> RSS-UTILITIES::*MENUBAR-BOTTOM* ;
> (/ (- RSS-UTILITIES::MAX-V
> RSS-UTILITIES::V-SIZE) 2)) ; ; caught
> WARNING: ; undefined variable:
> *MENUBAR-BOTTOM*
>
> ; (-
> RSS-UTILITIES::*SCREEN-HEIGHT*
> RSS-UTILITIES::*MENUBAR-BOTTOM*) ; ;
> caught WARNING: ; undefined
> variable: *SCREEN-HEIGHT*
>
> ; (IF RSS-UTILITIES::CONTAINER ;
> (RSS-UTILITIES::POINT-H ;
> (RSS-UTILITIES::VIEW-SIZE
> RSS-UTILITIES::CONTAINER)) ;
> RSS-UTILITIES::*SCREEN-WIDTH*) ; ;
> caught WARNING: ; undefined
> variable: *SCREEN-WIDTH*
>
> ; (RSS-UTILITIES::POINT-H
> (RSS-UTILITIES::VIEW-SIZE
> RSS-UTILITIES::VIEW)) ; ; caught
> STYLE-WARNING: ; undefined function:
> POINT-H
>
> ; (RSS-UTILITIES::POINT-V
> (RSS-UTILITIES::VIEW-SIZE
> RSS-UTILITIES::VIEW)) ; ; caught
> STYLE-WARNING: ; undefined function:
> POINT-V
有人知道我该如何运行这段代码吗? 是不是我对 Lisp 一无所知?
更新 [2009 年 3 月]: 我安装了 Clozure,但仍然无法运行代码。
在 CCL 命令提示符下,命令
(load "utilities.lisp")
导致以下错误输出:
;Compiler warnings :
; In CENTER-VIEW: Undeclared free variable *SCREEN-HEIGHT*
; In CENTER-VIEW: Undeclared free variable *SCREEN-WIDTH*
; In CENTER-VIEW: Undeclared free variable *MENUBAR-BOTTOM* (2 references)
> Error: Undefined function RANDOM-STATE called with arguments (64497 9) .
> While executing: CCL::READ-DISPATCH, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry applying RANDOM-STATE to (64497 9).
> Type :? for other options.
1 >
不幸的是,我仍在学习 Lisp,所以虽然我感觉有些东西没有完全定义,但我并不真正理解如何阅读这些错误消息。
回答:
That code is for Macintosh Common Lisp (MCL). It will only run there. Using Clozure CL (CCL) will not help. You would have to comment the graphics code. The random state stuff also is slightly special for MCL. You have to port it to portable Common Lisp (make-random-state, etc.). Also the file names are special for the Mac.
Clozure CL is a fork from Macintosh Common Lisp, but has be changed to Unix conventions (pathnames, …) and does not include the special graphics code of MCL.
这段代码是为 Macintosh Common Lisp (MCL) 编写的。 它只能在那里运行。 使用 Clozure CL (CCL) 没有帮助。 您必须注释掉图形代码。 随机状态的东西对于 MCL 来说也有点特殊。 您必须将其移植到可移植的 Common Lisp (make-random-state 等)。 此外,文件名对于 Mac 来说也很特殊。
Clozure CL 是 Macintosh Common Lisp 的一个分支,但已更改为 Unix 约定(路径名,…),并且不包含 MCL 的特殊图形代码。