我发现顶级声明顺序似乎并不重要。是否有关于该主题的任何文档?我不太明白。
显示函数可以在未定义的情况下被调用的示例
#lang racket
(define (function-defined-early)
(function-defined-later))
(define (function-defined-later)
1)
(function-defined-early)
> 1
Run Code Online (Sandbox Code Playgroud)
;; Common Lisp
(defun function-defined-early ()
(function-defined-later))
(defun function-defined-later ()
1)
(print (function-defined-early))
> 1
Run Code Online (Sandbox Code Playgroud) 在互联网上的大多数示例中,符号相等性很简单:
(eq 'sym 'sym)
t
Run Code Online (Sandbox Code Playgroud)
在我的程序中,我想比较自定义包中的符号:
(defpackage #:my-package
(:use #:common-lisp)
(:export #:my-function))
(in-package #:my-package)
(defun my-function (value)
(cond
((eq value 'sym)
(format t "SYM: YES~%"))
(t
(format t "SYM: NO~%"))))
(in-package #:common-lisp)
(my-package:my-function 'sym)
Run Code Online (Sandbox Code Playgroud)
但是当执行这段代码时,它显示:
SYM: NO
Run Code Online (Sandbox Code Playgroud)
这两个符号似乎不同:
(eq 'sym 'my-package::sym)
nil
Run Code Online (Sandbox Code Playgroud)
原因似乎很容易理解,在给定包中驻留的符号不等于在另一个包中驻留的同名符号。很公平!但是无论包如何,比较 2 个符号的习惯用法是什么?
我们应该首先将其转换为字符串并比较字符串吗?
(defpackage #:my-package
(:use #:common-lisp)
(:export #:my-function))
(in-package #:my-package)
(defun my-function (value)
(cond
((string= (symbol-name value) "SYM")
(format t "SYM: YES~%"))
(t
(format t "SYM: NO~%"))))
(in-package #:common-lisp)
(my-package:my-function 'sym)
Run Code Online (Sandbox Code Playgroud)
结果更好,但是关于字符大小写有一个明显的问题。
如何检查 2 个符号是否相同,无论其封装如何?