我正在尝试编写一个接受符号的函数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中完成吗?
答案 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