在roswell脚本中加载快速加载

时间:2018-08-24 16:51:31

标签: common-lisp

我是Common-Lisp的初学者,我与Roswell创建了Common-Lisp项目。

我找到了Quickutil(http://quickutil.org/)并将其用作以下代码。

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  (ql:quickload :quickutil :silent t)
  (qtlc:utilize
     :utilities '(:iota :riffle)
     :categories '(:alexandria)
     :symbols '(:split-sequence-if-not)))

(defpackage :ros.script.lbc.3744114298
  (:use :cl))
(in-package :ros.script.lbc.3744114298)

(defun main (&rest argv)
  (declare (ignorable argv))
  (princ (qtl:iota 5)))
;;; vim: set ft=lisp lisp:

运行./lbc.ros将得到以下错误。

Unhandled SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                                          {10005505B3}>:
  Package QTLC does not exist.

    Line: 22, Column: 15, File-Position: 461

    Stream: #<CONCATENATED-STREAM :STREAMS (#<SB-SYS:FD-STREAM for "file /Users/conao/.roswell/local-projects/lbc/src/lbc.ros" {1002EDF3A3}>
                                            #<SB-IMPL::STRING-INPUT-STREAM {1002EE1113}>) {1002EE3EF3}>

Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005505B3}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-INT:SIMPLE-READER-PACKAGE-ERROR "Package ~A does not exist." {1002F79883}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<SB-INT:SIMPLE-READER-PACKAGE-ERROR "Package ~A does not exist." {1002F79883}>)
...

小修正ptlc:利用位置。

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  (ql:quickload :quickutil :silent t))

(defpackage :ros.script.lbc.3744114298
  (:use :cl))
(in-package :ros.script.lbc.3744114298)

(defun main (&rest argv)
  (declare (ignorable argv))
  (qtlc:utilize
     :utilities '(:iota :riffle)
     :categories '(:alexandria)
     :symbols '(:split-sequence-if-not))
  (princ (qtl:iota 5)))
;;; vim: set ft=lisp lisp:

运行小型修订代码,因为./lbc.ros会出现以下错误。

Unhandled SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread #<SB-THREAD:THREAD "main thread" RUNNING
                                                          {10005505B3}>:
  Symbol "IOTA" not found in the QUICKUTIL package.

    Line: 22, Column: 18, File-Position: 473

    Stream: #<CONCATENATED-STREAM :STREAMS (#<SB-SYS:FD-STREAM for "file /Users/conao/.roswell/local-projects/lbc/src/lbc.ros" {1002EDF3A3}>
                                            #<SB-IMPL::STRING-INPUT-STREAM {10019EB603}>) {1002EE3EF3}>

Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {10005505B3}>
0: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-INT:SIMPLE-READER-PACKAGE-ERROR "Symbol ~S not found in the ~A package." {100206D693}> #<unused argument> :QUIT T)
1: (SB-DEBUG::RUN-HOOK SB-EXT:*INVOKE-DEBUGGER-HOOK* #<SB-INT:SIMPLE-READER-PACKAGE-ERROR "Symbol ~S not found in the ~A package." {100206D693}>)
...

如何在Roswell脚本中使用Quikutil?

顺便说一句,我可以在Roswell REPL中使用Quickutil。

$ ros run
* (ql:quickload :quickutil :silent t)

(:QUICKUTIL)
* (qtlc:utilize
     :utilities '(:iota :riffle)
     :categories '(:alexandria)
     :symbols '(:split-sequence-if-not))
; compiling...

* (princ (qtl:iota 5))
(0 1 2 3 4)
(0 1 2 3 4)

2 个答案:

答案 0 :(得分:2)

在加载文件时,首先读取顶级表单,然后进行编译,然后加载。如果阅读一种形式取决于加载另一种形式,则需要更早地评估另一种形式。

将此类表格包装在eval-when中:

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ros:ensure-asdf)
  (ql:quickload :quickutil :silent t))

诸如defun之类的标准顶级定义宏已经扩展为这种形式,因此您通常不必考虑这一点。

答案 1 :(得分:1)

将qtlc:utilize移到单独的顶级表单中所需的全部内容,如下所示:

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  (ql:quickload :quickutil :silent t))

(qtlc:utilize
     :utilities '(:iota :riffle)
     :categories '(:alexandria)
     :symbols '(:split-sequence-if-not))

(defpackage :ros.script.lbc.3744114298
  (:use :cl))
(in-package :ros.script.lbc.3744114298)

(defun main (&rest argv)
  (declare (ignorable argv))
  (princ (qtl:iota 5)))
;;; vim: set ft=lisp lisp:

这样,当lisp评估表单时

(qtlc:utilize
     :utilities '(:iota :riffle)
     :categories '(:alexandria)
     :symbols '(:split-sequence-if-not))

它将知道软件包qtlc,因为它是由以前的表单加载的。

您还可以保留对qtlc:utilize的调用,但可以使用uiop:symbol-call函数来调用它,如下所示:

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  (ql:quickload :quickutil :silent t)
  (uiop:symbol-call :qtlc :utilize
     :utilities '(:iota :riffle)
     :categories '(:alexandria)
     :symbols '(:split-sequence-if-not)))

(defpackage :ros.script.lbc.3744114298
  (:use :cl))
(in-package :ros.script.lbc.3744114298)

(defun main (&rest argv)
  (declare (ignorable argv))
  (princ (qtl:iota 5)))
;;; vim: set ft=lisp lisp:

uiop:symbol-call完成工作后,功能qtlc:utilize将在运行时解析符号ql:quickload