代码之家  ›  专栏  ›  技术社区  ›  rwallace

引用全局符号

  •  0
  • rwallace  · 技术社区  · 6 年前

    static ; 在C++中,你也可以用它们包围它们。 namespace { ... } . 我在Lisp中得到的印象是,包系统是合适的工具。然而,我的尝试到目前为止还没有成功。

    这是我目前拥有的,但SBCL拒绝它的说法,即 global-fun 未定义。明确地称之为 cl-user:global-fun

    (defun global-fun ()
      (format t "global~%"))
    
    (defpackage :local-package
      (:use :common-lisp)
      (:use :cl-user))
    (in-package :local-package)
    
    (defun local-fun ()
      (global-fun)
      (format t "local~%"))
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Ehvince    6 年前

    你就快到了。你可以用Slime的自动补全来找出答案。

    global-fun ,或使用 双重的 (cl-user::global-fun) .

    和另一个 global-package :

    (defpackage :global-package
     (:use :common-lisp) ;; <-- can be :cl
     ;; (:use :cl-user) <-- not necessary
     (:export :global-fun))
    
     (in-package :global-package)
    
    (defun global-fun () …)
    
    (defpackage :local-package
      (:use :cl
            :global-defun)) ;; <-- one ":use" is possible
    (in-package :local-package)
    
    ; etc
    
        2
  •  2
  •   Svante    6 年前

    在commonlisp中没有全局函数。你首先在文件中定义的东西, global-fun 一些 cl-user

    包和文件之间也没有直接的对应关系。可以在单个文件中为不同的包定义内容,也可以在多个文件中为单个包定义内容。为了使内容清晰易读,有一个非常明智的约定,即总是以 in-package 窗体(在某些样式中前面有 defpackage 形式),再也不放 包装内 文件后面的某个地方。

    当你写一个没有包装的符号时,例如。g。 somefun myarray 读者 在阅读源代码表单时。在以下两种形式中,名为 foo 插入到当前包中(并且两者都会导致使用相同的符号):

    (defun foo ()
      …)
    
    (foo)
    

    为了引用不同包中的符号,需要将包名称作为前缀 :: 作为分隔符 my-package::foo

    (defpackage my-package
      (:use common-lisp)
      (:export foo))
    

    你可以参考 用一个冒号作为分隔符的另一个包中的符号,如 my-package:foo

    现在 当前程序包 只是变量的值 *package* . 如果您从REPL会话的角度来看,这就是最近 包装内 包装内 形式。在文件中的单表单编译上下文中,IDE将(在我所见过的任何情况下)查找前面的代码 common-lisp-user ,它有一个昵称 cl用户 .