我正在尝试编写一个函数 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 中完成吗?
最佳答案
您的符号:
#:|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
关于lisp - make-symbol 向生成的符号添加不需要的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443087/