lisp代码合并_合并通用Lisp中的符号

I want to insert a char into a list. However, I want to merge this char with the last symbol in the list. With appends and cons the result is always two different symbols. Well, I want one merged symbol to be my result.

Example:

(XXXX 'a '5) ====> (a5)

What I would like to have, instead of:

(XXXX 'a '5) ====> (a 5)

解决方案

You cannot "merge symbols" in Lisp.

First of all, 5 is not a symbol, but a number. If you want a symbol named "5" you have to type it as |5| (for example).

If a function takes the symbol A and symbol |5|, and produces the symbol A5, it has not merged symbols. It has created a new symbol whose name is the catenation of the names of those input symbols.

Properly designed Lisp programs rarely depend on how a symbol is named. They depend on symbols being unique entities.

If you're using symbols to identify things, and both 5 and A identify some entity, the best answer isn't necessarily to create a new symbol which is, in name at least, is a mashup of these two symbols. For instance, a better design might be to accept that names are multi-faceted or compound in some way. Perhaps the list (A 5) can serve as a name.

Common Lisp functions themselves can have compound names. For instance (setf foo) is a function name. Aggregates like lists can be names.

If you simply need the machine to invent unique symbols at run-time, consider using the gensym function. You can pass your own prefix to it:

(gensym "FOO") -> #:FOO0042

Of course, the prefix can be the name of some existing symbol, pulled out via symbol-name. The symbol #:FOO0042 is not unique because of the 0042 but because it is a freshly allocated object in the address space. The #: means it is not interned in any package. The name of the symbol is FOO0042.

If you still really want to, a simple way to take the printed representation of a bunch of input objects and turn it into a symbol is this:

(defun mashup-symbol (&rest objects)

(intern (format nil "~{~a~}" objects)))

Examples:

(mashup-symbol 1 2 3) -> |123|

(mashup-symbol '(a b) 'c 3) -> |(A B)C3|

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值