2016-02-12 24 views
3

我quicklisp更新到最新版本二月,去重新运行我的几个单元测试的xlmanip工作簿/工作表的读者我发展。 SBCL在单元测试borks,因为它重新编译closure-common包和closure-common修改标准readtable(在一个不错的方式,其实。)封常见:SBCL borks因为标准readtable修改

我的一个选择是用叉子叉closure-common代码库,希望维护者实际响应修补程序,并且祈祷该修补程序已被接受,请在quicklisp中遵循clozure-common依赖关系,其中SET-DISPATCH-MACRO-CHARACTER也因相同的原因而被调用。

有谁知道这个问题的一种解决方法? closure-common不是唯一有此问题的软件包,我相当确定。

编辑:如果我必须克隆和破解clozure-common,本地化可修改的修改或切换到自定义可读表的建议/首选方式是什么?

编辑#2:下面是一个使用新安装的quicklisp输出成绩单(具体看看closure-common-20101107-git/syntax.lisp最后一行在调用SET-DISPATCH-MACRO-CHARACTER发生):

To load "xlmanip/tests": 
    Load 1 ASDF system: 
    xlmanip/tests 
; Loading "xlmanip/tests" 
. 
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points. 
yes, using code points. 
.. 
;;; Checking for wide character support... WARNING: Lisp implementation doesn't use UTF-16, but accepts surrogate code points. 
yes, using code points. 
;;; Building Closure with CHARACTER RUNES 
........While evaluating the form starting at line 4, column 0 
    of #P"/tmp/xlmanip17497a.lisp": 
Fatal condition: 
SET-DISPATCH-MACRO-CHARACTER would modify the standard readtable. 
See also: 
    The ANSI Standard, Section 2.1.1.2 
    The ANSI Standard, Glossary entry for "standard readtable" 
Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1002A7D263}> 
0: ((LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX)) 
1: (SB-IMPL::CALL-WITH-SANE-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {1006B1F8BB}>) 
2: (SB-IMPL::%WITH-STANDARD-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {1006B1F88B}>) 
3: (SB-DEBUG:PRINT-BACKTRACE :STREAM #<SB-SYS:FD-STREAM for "standard error" {1003135713}> :START 0 :FROM :DEBUGGER-FRAME :COUNT 4611686018427387903 :PRINT-THREAD T :PRINT-FRAME-SOURCE NIL :METHOD-FRAME-STYLE NIL :EMERGENCY-BEST-EFFORT NIL) 
4: ((LAMBDA NIL :IN UIOP/IMAGE:PRINT-BACKTRACE)) 
5: ((LAMBDA NIL :IN UIOP/STREAM:CALL-WITH-SAFE-IO-SYNTAX)) 
6: (SB-IMPL::%WITH-STANDARD-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN UIOP/STREAM:CALL-WITH-SAFE-IO-SYNTAX) {1006B1F86B}>) 
7: (UIOP/IMAGE:PRINT-CONDITION-BACKTRACE #<SB-INT:STANDARD-READTABLE-MODIFIED-ERROR {1006B1D643}> :STREAM #<SB-SYS:FD-STREAM for "standard error" {1003135713}> :COUNT NIL) 
8: (UIOP/IMAGE:HANDLE-FATAL-CONDITION #<SB-INT:STANDARD-READTABLE-MODIFIED-ERROR {1006B1D643}>) 
9: (SIGNAL #<SB-INT:STANDARD-READTABLE-MODIFIED-ERROR {1006B1D643}>) 
10: (CERROR "Frob it anyway!" SB-INT:STANDARD-READTABLE-MODIFIED-ERROR :OPERATION SET-DISPATCH-MACRO-CHARACTER) 
11: (SET-DISPATCH-MACRO-CHARACTER #\# #\/ RUNES::RUNE-READER #<READTABLE {100041EA83}>) 
12: (SB-FASL::LOAD-FASL-GROUP #S(SB-FASL::FASL-INPUT :STREAM #<SB-SYS:FD-STREAM for "file <homedir>/.cache/common-lisp/sbcl-1.3.1.243-55a6786-macosx-x64/<homedir>/quicklisp/dists/quicklisp/software/closure-common-20101107-git/syntax.fasl" {1006B0F693}> :TABLE #(282 SET *PACKAGE* "RUNES" #<PACKAGE "SB-IMPL"> SB-IMPL::%DEFUN #<PACKAGE "RUNES"> RUNES::RT-WHITE-SPACE-P STRING MAKE-STRING-INPUT-STREAM :EOF PEEK-CHAR ...) :STACK #(0 SET-DISPATCH-MACRO-CHARACTER #\# #\/ RUNES::RUNE-READER 0 50 "<homedir>/quicklisp/dists/quicklisp/software/closure-common-20101107-git/syntax.lisp" #<SB-KERNEL:LAYOUT for SB-C:DEFINITION-SOURCE-LOCATION {10000415B3}> NIL NIL NIL ...) :DEPRECATED-STUFF NIL :SKIP-UNTIL NIL) NIL) 
<...truncated... error occurs in syntax.lisp> 

生成此输出的脚本:

#!/bin/sh 

tmpf=/tmp/xlmanip$$a.lisp 
cat >${tmpf} <<__EOF__ 
(proclaim '(optimize speed space)) 
;;; SBCL:Muffle compiler-notes 
#+sbcl (declaim (sb-ext:muffle-conditions sb-ext:compiler-note)) 
(ql:quickload :xlmanip/tests) 
(time (asdf:oos 'asdf:test-op :xlmanip)) 
(quit) 
__EOF__ 

trap "rm -f ${tmpf}" 0 1 2 3 15 

if test "x${CL_LISPS}" = x; then 
    CL_LISPS="sbcl ccl clisp ecl" 
fi 

for l in $CL_LISPS; do 
    echo "\n======== $l ========\n" 
    cl-launch --lisp $l --execute --quicklisp --init '(load "'"${tmpf}"'")' 
done 
+0

我使用'CL-launch'运行5AM单元测试,所以想必,我可以在测试脚本的开始复制readtable。但是,对于使用'xlmanip'的未来用户来说,这会产生令人讨厌的后果,因为他们在加载'xlmanip'时不得不做同样的事情。 –

+0

我使用Clozure CL开发,无论对错,都不介意对标准可读表进行修改。 –

+0

我似乎无法重现该问题,但关于您的编辑,请参阅[named-readtables](https://common-lisp.net/project/named-readtables/)。 – jkiiski

回答

1

诊断问题:某处加载closure-common码流中,似乎有类似的电话:

(with-standard-io-syntax 
    (load "closure-common")) 

这是我发现跳闸标准*readtable*修改的唯一途径。在所有其他情况下,例如,从sbcl提示,set-dispatch-macro-character不修改标准*readtable*。我没有将问题追溯到ASDF,UIOP或Quicklisp本身,尽管这些问题也可能是候选人。

我咬咬牙,克隆封常见回购,决定去named-readtables。很可能,如果我发布这些更改quicklisp,含蓄地maintainership,会有波动变化成使用由closure-common提供#"和​​读者宏等相关软件包。