make-symbol为生成的符号添加了不需要的格式

时间:2014-01-29 21:32:25

标签: lisp package common-lisp symbols

我正在尝试编写一个接受符号的函数primeify,并返回附加了“-prime”的符号。我想要的输出是:

[1] > (primeify 'y)
Y-PRIME

(或y-prime,此案不是主要观点,尽管稍后可能会有所涉及。)

这是我当前(错误的)实施:

(defun primeify (sym)
     (make-symbol (concatenate 'string (string sym) "-prime")))

但是,make-symbol通过使用其他格式将其混乱来破坏输出。我的输出是:

[1]> (primeify 'y)
#:|Y-prime|

有没有办法避免make-symbol或我可以用来实现此功能的其他功能完成的额外处理?这甚至可以在lisp中完成吗?

1 个答案:

答案 0 :(得分:7)

您的符号:

#:|Y-prime|

这是一个非实习符号。它没有包装。因此,#:位于符号前面。

它也是带有大小写混合的符号名称。因此,它用垂直条逃脱。请记住,默认情况下,符号名称内部存储在大写中。

(defun primeify (sym)
  (let ((name (concatenate 'string
                           (string sym)
                           "-PRIME")))
    (if (symbol-package sym)
        (intern name (symbol-package sym))
      (make-symbol name))))

上述函数为新符号提供与原始符号相同的包(如果有)。

CL-USER 3 > (primeify 'foo)
FOO-PRIME
NIL

CL-USER 4 > (primeify '#:foo)
#:FOO-PRIME