我在导出宏时遇到问题,当它在同一个包中声明时它会起作用,但在导入它时却不行.我在Windows上使用Emacs,SLIME,Clozure.
包文件
(defpackage :tokenizer
(:use :common-lisp)
(:export :tokenize-with-symbols
:current-token
:advanze-token
:peek-token
:with-token-and-peek
:with-token))
(defpackage :csharp-parser
(:use :common-lisp :tokenizer)
(:import-from :tokenizer :with-token-and-peek :with-token))
Run Code Online (Sandbox Code Playgroud)
Tokenizer文件
(in-package :tokenizer)
(defmacro with-token-and-peek (&body body)
`(let ((token (current-token tokenizer))
(peek (peek-token tokenizer)))
,@body))
Run Code Online (Sandbox Code Playgroud)
解析器文件
(in-package :csharp-parser)
(defun expression (tokenizer node-stack)
(with-token-and-peek
(cond ((is-number? token) (make-value-node "number" token))
((is-bool? token) (make-value-node "bool" token))
((is-identifier? token peek) (make-identifier-node tokenizer node-stack))
(t (make-ast-node :identifier "bla")))))
Run Code Online (Sandbox Code Playgroud)
在编译时给出错误:
csharpParser.lisp:265:3:
warning: Undeclared free variable TOKENIZER::TOKENIZER (2 references)
style-warning: Unused lexical variable TOKENIZER::PEEK …
Run Code Online (Sandbox Code Playgroud) 在下面的简单的计算,c
并d
结束了不同的值(它们是关闭的单个位).这是为什么?
a := 4000.0
b := 1e-9
c := a / b
d := 4000.0 / 1e-9
Run Code Online (Sandbox Code Playgroud) 我已经读过有关intern()的信息,几乎所有地方都写到它会使用==而不是equals()来加速字符串比较。
String a = new String("1");
String b = new String("1");
Run Code Online (Sandbox Code Playgroud)
如果我是对的,上面的代码将在字符串池中创建2个字符串。但是在阅读了有关实习生的内容之后,我看不出有理由在池中保存两个具有相同值的字符串的原因。
所以问题是:为什么Java默认不使用intern()?
如果可能的话,我想获得详细的解释。