SBCL(Steel Bank Common Lisp)腳本啟動筆記

當sbcl以腳本形式(sbcl --script)運行,它不會加載任何額外文件。當我們的腳本中有其他依賴時,就會變得很棘手。以下,以我自己實際經(jīng)驗(一個簽到的小功能)介紹怎么配置sbcl的腳本環(huán)境。

首先,需要一個調(diào)用腳本,文件名稱是sign.lisp。里面的內(nèi)容很簡單,但是需要依賴一個其他的系統(tǒng)
sign.lisp:

(in-package :cl-user)
(require :cl-163-music)

(multiple-value-bind (res0 res1)
 (cl-163-music:daily-sign "username" "password")
 (format t "~A ~% ~A ~%" res0 res1))

然后用shell調(diào)用sbcl加載sign.lisp

#!/usr/bin/env sh
PATH="/Users/nero/devel/shell/163.music.sign/"
SBCL_PATH="/Users/nero/tanshuai/sbcl/bin/"

${SBCL_PATH}sbcl --noinform --core ${PATH}core --script ${PATH}sign.lisp

shell也很簡單,但是里面有一個--core選項。好了,重點來了,core文件是什么?怎么生成的?

core文件就是一個環(huán)境鏡像文件,它的作用就是解決腳本的依賴,提供一個運行時環(huán)境包,含了當時運行時刻所有狀態(tài),我們可以先加載所有的必須條件后,用sb-ext:save-lisp-and-die生成出的鏡像文件。

由于cl-163-music符合asdf結(jié)構(gòu),此處我用了lisp的三方管理包quicklisp(類似于python的pip,nodejs的npm等等,至于怎么安裝的此處不再敘述),quicklisp會自動管理asdf項目,解決cl-163-music的依賴。cl-163-music是自己的本地項目,并且sign.lisp里(require :cl-163-music)的需要,所以生成鏡像前需要(push #P"/Users/nero/devel/lisp/cl-163-music/" asdf:*central-registry*)
到此,所有工作都完成了,這里有個小插曲,當我運行的時候,報錯了:

ASDF could not load cl-163-music because
Don't know how to REQUIRE sb-rotate-byte.
See also:
  The SBCL Manual, Variable *MODULE-PROVIDER-FUNCTIONS*
  The SBCL Manual, Function REQUIRE.
Unhandled SB-INT:EXTENSION-FAILURE in thread #<SB-THREAD:THREAD
                                               "main thread" RUNNING
                                                {10033AEC13}>:
  Don't know how to REQUIRE sb-rotate-byte.
See also:
  The SBCL Manual, Variable *MODULE-PROVIDER-FUNCTIONS*
  The SBCL Manual, Function REQUIRE
... ...
...

解決辦法就是,再次進入sbcl環(huán)境,運行下(require "sb-rotate-byte"),然后重新生成鏡像。

ps:缺點就是鏡像文件太大了,大約50多MB。

簽到小功能: cl-163-music

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容