Я не большой хакер SBCL, но смотрю на toplevel.lisp, похоже, что код, который обрабатывает --script
:
(defun process-script (script)
(flet ((load-script (stream)
;; Scripts don't need to be stylish or fast, but silence is usually a
;; desirable quality...
(handler-bind (((or style-warning compiler-note) #'muffle-warning)
(stream-error (lambda (e)
;; Shell-style.
(when (member (stream-error-stream e)
(list *stdout* *stdin* *stderr*))
(exit)))))
;; Let's not use the *TTY* for scripts, ok? Also, normally we use
;; synonym streams, but in order to have the broken pipe/eof error
;; handling right we want to bind them for scripts.
(let ((*terminal-io* (make-two-way-stream *stdin* *stdout*))
(*debug-io* (make-two-way-stream *stdin* *stderr*))
(*standard-input* *stdin*)
(*standard-output* *stdout*)
(*error-output* *stderr*))
(load stream :verbose nil :print nil)))))
(handling-end-of-the-world
(if (eq t script)
(load-script *stdin*)
(with-open-file (f (native-pathname script) :element-type :default)
(sb!fasl::maybe-skip-shebang-line f)
(load-script f))))))
Похоже, файл открывается с помощью (with-open-file (f (native-pathname script) :element-type :default) …)
. Согласно ответу на usockets: как указать внешний формат при открытии сокета, кодировка по умолчанию должна быть UTF -8, и быстрый интерактивный тест, кажется, подтверждает:
CL-USER> sb-impl::*default-external-format*
:UTF-8
Однако, в зависимости от порядка обработки параметров, вы можете использовать параметр --eval
для установки sb-impl::*default-external-format*
перед обработкой скрипта. Например, командная строка вида:
$ sbcl --eval '(setf sb-impl::*default-external-format* …)' --script my-script.lisp
Однако, тем не менее, я совсем не уверен, поддерживается ли это или нет. Согласно теме на comp.lang.lisp, Как изменить внешний формат в SBCL (ошибка кодирования c-строки), кодировка по умолчанию определяется путем изучения среды, поэтому в среде может быть что-то, что вы можете сделать, чтобы получить кодировку, которая вам нужна в качестве По умолчанию. Один ответ в этой теме указывает, что может работать следующее:
$ LC_CTYPE=en_US.UTF-8
$ export LC_CTYPE
$ sbcl --script my-script.lisp
person
Joshua Taylor
schedule
02.04.2014