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

App*_*ish 1 lisp symbols common-lisp package

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

[1] > (primeify 'y)
Y-PRIME
Run Code Online (Sandbox Code Playgroud)

(或者y-prime,这种情况不是主要观点,尽管后来可能会变得相关).

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

(defun primeify (sym)
     (make-symbol (concatenate 'string (string sym) "-prime")))
Run Code Online (Sandbox Code Playgroud)

但是,make-symbol通过使用其他格式将其混乱来修改输出.我的输出是:

[1]> (primeify 'y)
#:|Y-prime|
Run Code Online (Sandbox Code Playgroud)

有没有办法避免这个额外的处理make-symbol,或者我可以用来实现这个的另一个功能?这甚至可以在lisp中实现吗?

Rai*_*wig 7

你的符号:

#:|Y-prime|
Run Code Online (Sandbox Code Playgroud)

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

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

(defun primeify (sym)
  (let ((name (concatenate 'string
                           (string sym)
                           "-PRIME")))
    (if (symbol-package sym)
        (intern name (symbol-package sym))
      (make-symbol name))))
Run Code Online (Sandbox Code Playgroud)

上面的函数给新符号提供与原始符号相同的包,如果有的话.

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

CL-USER 4 > (primeify '#:foo)
#:FOO-PRIME
Run Code Online (Sandbox Code Playgroud)

  • 为了在不同的设置下获得最一致的行为,我将使用`(string'#: - prime)`或`(symbol-name'#: - prime)`而不是``-PRIME"`.实际上,这可能发生在读取时间,所以`#.(symbol-name'#: - prime)`就没问题了.当然,这些设置总是可以在运行时更改,因此没有全面的解决方案. (2认同)