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中实现吗?
你的符号:
#:|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)