我是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)
答案 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
。