Как запустить лисповский код Саттона и Бартона "Обучение усилению"? - PullRequest
7 голосов
/ 10 февраля 2009

В последнее время я много читал о Обучение усилению , и я нашел "Обучение усилению: Введение" как превосходное руководство. Внимательно предоставленный автором исходный код для многих из их отработанных примеров.

Прежде чем я начну задавать вопрос, я должен отметить, что мои практические знания о lisp минимальны. Я знаю основные понятия и как это работает, но я никогда не использовал осмысленно lisp, так что, скорее всего, я просто делаю что-то невероятное. :)

Кроме того, автор заявляет на своей странице, что он не будет отвечать на вопросы о его коде, поэтому я не связывался с ним, и решил, что переполнение стека будет гораздо лучшим выбором.

Я пытался запустить код на Linux-машине, используя GNU CLISP и SBCL, но не смог его запустить. Я продолжаю получать полный список ошибок, используя любой интерпретатор. В частности, большая часть кода использует множество утилит, содержащихся в файле 'utilities.lisp', который содержит строки

(defpackage :rss-utilities
  (:use :common-lisp :ccl)
  (:nicknames :ut))

(in-package :ut)

Кажется, что: ccl ссылается на какую-то версию lisp для Mac, но я не могу этого подтвердить, это может быть просто какой-то другой пакет кода.

> * (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

Кто-нибудь знает, как я могу запустить этот код? Я просто совершенно не осведомлен обо всем, Лисп?

ОБНОВЛЕНИЕ [март 2009]: Я установил 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, поэтому, хотя у меня есть ощущение, что что-то определено не полностью, я не совсем понимаю, как читать эти сообщения об ошибках.

Ответы [ 5 ]

4 голосов
/ 11 февраля 2009

Я предполагаю, что код зависит от CCL, поэтому используйте CCL вместо CLISP или SBCL. Вы можете скачать его здесь: http://trac.clozure.com/openmcl

3 голосов
/ 13 марта 2009

Этот код предназначен для Macintosh Common Lisp (MCL). Он будет работать только там. Использование Clozure CL (CCL) не поможет. Вы должны были бы прокомментировать графический код. Материал случайного состояния также немного особенный для MCL. Вы должны перенести его на переносимый Common Lisp ( make-random-state и т. Д.). Также имена файлов специально для Mac.

Clozure CL - это ответвление от Macintosh Common Lisp, но оно было изменено на соглашения Unix (пути, ...) и не включает специальный графический код MCL.

2 голосов
/ 13 мая 2013

Если вы никогда не использовали осмысленно lisp, существует код Matlab для «Обучение усилению: введение».

2 голосов
/ 13 апреля 2009

Использование последней версии CCL на linux x86 с сохранением этого файла как foo.lisp:

#+ccl (defun random-state (x y)
        (ccl::initialize-random-state x y))

(load "utilities.lisp")
(use-package 'rss-utilities)


(load "testbed.lisp")

(setup)
(init)

(print (runs 10 10 .1))

Запуск

~/svn/ccl/lx86cl -l foo.lisp

печатает кучу предупреждающих сообщений и желаемый ответ:

(-0.77201915 0.59691894 0.78171235 0.41514033 0.6744591 0.26383805 0.8981678 1.1274683 0.50265205 0.4081622)

Чтобы выяснить требуемый # 'определение случайного состояния, я предположил, что «#. (RANDOM-STATE 64497 9)» был сериализованным объектом случайного состояния из MCL. Чтобы увидеть, как CCL справляется с этим, я проверил, что выводит MAKE-RANDOM-STATE в CCL:

$ ~/svn/ccl/lx86cl 
Welcome to Clozure Common Lisp Version 1.3-r11936  (LinuxX8632)!
? (make-random-state)
#.(CCL::INITIALIZE-RANDOM-STATE 64497 9)
0 голосов
/ 29 ноября 2015

В дополнение к Ответ Райнера Йосвига : После установки Clozure вам придется обновить ссылки на функцию RANDOM-STATE в utilities.lisp до random-mrg31k3p-state.

Более конкретно заменить: #.(RANDOM-STATE 64497 9) на #.(ccl::random-mrg31k3p-state)

random-mrg31k3p-state, кажется, заменил random-state через некоторое время после написания кода, см. l1-numbers.lisp? Rev = 13327

...