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

关于命名和使用包的常见Lisp

  •  1
  • anquegi  · 技术社区  · 6 年前

    我尝试使用常见的Lisp包,但我有几个(可能是命名约定)问题,第一个问题是使用“:”,这似乎不是必要的,但就像 sharp-quote in functions 根据您的上下文,最好使用它。

    (defpackage   #:match-test
      (:use       #:match
                  #:fiveam
                  #:cl)
      (:export #:run!
               #:test-match)
      (:documentation "Test package for testing match project 1 of CS202"))
    

    那就是如何使用这个包裹

    (in-package #:match-test)
    
    (in-package :match-test)
    
    (in-package match-test)
    

    它可以工作,但当我要删除该包时,它只能与以下对象一起工作:

    CL-USER> (delete-package (in-package #:match-test))
    #<BOOLEAN <<error printing object>> {2010004F}>
    

    它给出了那个错误,但它使任务完成。它似乎把包作为一个对象,我也不明白 hyperspec ,这是一个我需要学习CLOS的问题,这是真的,我是一个初学者,学习Lisp,但我想我可以得到一个简单的澄清我的疑问。

    我希望我说得很清楚。

    最后我想说我用了emacs+sly+roswell和

    CL-USER> (lisp-implementation-type)
    "SBCL"
    CL-USER> (lisp-implementation-version)
    "1.4.6"
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Rainer Joswig Michael Fox    6 年前

    DEFPACKAGE IN-PACKAGE 定义为宏。它们的字面意思是-a 字符串指示符 : foobar , |FOOBAR| , #:FOOBAR , :FOOBAR "FOOBAR" .

    DELETE-PACKAGE 是一个函数,也需要一个字符串指示符。但因为它是一个函数,所以参数是被计算出来的。这意味着:如果你想传递这个名字,你必须引用它——如果它是一个不在关键字包中的符号。字符串和关键字符号是自评估的,不需要引用。的有效参数 删除包 例如:

    'foobar
    '|FOOBAR|
    '#:FOOBAR
    :FOOBAR or ':FOOBAR
    "FOOBAR" or '"FOOBAR"
    

    自从 删除包 是一个函数,参数将被计算->您还可以计算变量、函数调用…作为论据。

    错误:删除当前包

    LISP工作:

    CL-USER 43 > (delete-package (in-package #:match-test))
    
    Error: Cannot delete the current package, #<The MATCH-TEST package, 0/16 internal, 2/16 external>.
      1 (abort) Return to top loop level 0.
    

    SBCL:

    * (delete-package (in-package #:match-test))
    
    debugger invoked on a SIMPLE-TYPE-ERROR in thread
    #<THREAD "main thread" RUNNING {10005605B3}>:
      *PACKAGE* can't be a deleted package:
        It has been reset to #<PACKAGE "COMMON-LISP-USER">.
    

    您的代码试图删除 当前程序包 -你刚用过 包装内 使其成为当前包-删除当前包通常不是一个好主意。你在开枪打自己的脚。Lisp可能会阻止这种情况(就像我在LispWorks中的例子一样)或者允许这种情况发生——但是你必须忍受后果。