在portacle中,“冒号后面的非法终止字符:#\”,尽管代码中没有冒号

时间:2019-05-05 00:27:53

标签: lisp common-lisp sbcl portacle

我最近设置了Portacle 1.3,以学习Win 7上的常见Lisp。但是,每当我运行代码时,即使没有代码,也会出现错误。 但是,运行单独的行效果很好。该错误仅在我运行整个文件时显示。

我尝试将一些代码放入EVAL函数中,但我相信一次只能接受一个参数,因此无法在其中运行整个程序。

我在this stackoverflow页面中发现了类似的错误,但是他们的代码包含冒号,这就是他们的错误所在。

我认为运行我的代码可能是错误的,即使我不使用任何代码进行编译,也能看到错误,但我一无所知。

完整错误:

main.lisp:1:1:
  read-error: 
    READ error during COMPILE-FILE:

      illegal terminating character after a colon: #\

        Line: 1, Column: 13, File-Position: 12

        Stream: #<SB-INT:FORM-TRACKING-STREAM for "file [path to file]\\main.lisp" {1005F5F0D3}>

Compilation failed.

1 个答案:

答案 0 :(得分:4)

Portacle是一个独立的Emacs,打包了Common Lisp开发所需的一切,并使用SBCL作为Common Lisp实现。

我相信您说“编译整个文件”时所执行的操作是调用slime-compile-and-load-file,该调用默认情况下绑定到键序列C-c C-k。这里有很多移动的组件:

  • Emacs是此处的文本编辑器。它还负责启动Common Lisp开发的所有必需组件。
  • Slime是这样的组件之一。它充当Emacs与Common Lisp实现(在这种情况下为SBCL,但理论上支持任何Lisp)之间的接口。基本上,它将您在Emacs中编写的代码发送到Lisp进行评估。
  • SBCL是Common Lisp实现。在这种情况下,它是一个编译器。这就是评估它收到的代码并通过Slime向Emacs中的用户界面输出答案的方法。在您通过修改已加载的Lisp图像的状态,跟踪定义的函数,全局动态变量等等来与之交互的意义上,它也“存在”。这就是为什么您可以拥有REPL,以及为什么需要Slime与之交互的原因。

所以要调试您的问题,我会尝试:

  • 从Windows Shell启动SBCL,然后运行简单的.lisp文件以检查一切是否正常。例如,您可以将(format t "~a" (lisp-implementation-type))放在.lisp文件中,并通过调用(load "...\\file.lisp")从Shell在SBCL中运行它。它应该返回"SBCL"
  • 使用Emacs(而不是可能会弄乱文件的怪异Windows程序)创建一个全新文件(C-x C-f),然后尝试从此处调用编译(C-c C-k)。

我相信您对IDE的选择是正确的。如果您是Common Lisp的入门者并且不知道Emacs的配置,那么Portacle可以说是最简单的工具。按键绑定有些令人生畏。