lisp - make-symbol 向生成的符号添加不需要的格式

标签 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 中完成吗?

最佳答案

您的符号:

#:|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/

相关文章:

loops - 如何在 `count` 表单中使用函数 `iterate`?

list - 检查 clisp 中的模式列表

java - 在 Eclipse 中将 native 库导出到外部包不起作用。这是一个错误吗?

Delphi IDE 项目 "Clean"命令——它有什么作用?

scheme - 如何在 Lisp 中将函数存储在变量中并使用它

functional-programming - 不使用中间列表过滤范围

lisp - 我怎样才能让 Lisp 编译器忽略一个 (label-variety) 函数?

emacs - 从 lisp (elisp) 的关联列表中弹出一个元素

recursion - 为什么在递归函数中向上计数总是需要两个参数?

java - 如何正确组织java包