[如果我有一个原子,例如“ a4”,我需要能够在“ 4”部分加1使其成为a5,但是由于它被认为是字符串,所以这是不可能的,所以如果我可以分割(a4)放入((a)(4))中,然后我可以对4进行计算,然后将它们重新放在一起...
但是,我不确定如何将原子分成原子单词的列表?这可能吗?
编辑:我当前正在使用通用Lisp。我有一个字符串列表(a3 d14 c2)等,但是我需要能够将它们中的每一个都分开,以分隔起始字母和继续进行的数字。
来自http://www.thefreedictionary.com/atom
Atom
[..]被认为是指定系统的不可约组成部分。 [..]
我想这是麦卡锡命名Lisp原子时一直在想的定义。
因此,您试图实现的目标非常罕见,而不是一般情况下(常见或任何)Lisp的工作方式。通常,您将两个不同的原子(例如令牌和数字)分别表示为两个不同的原子,并将它们连接起来,例如使用缺点单元格:
(defvar *data* (cons "answer" 42))
*data*
;; => ("answer" . 42)
如果您希望将其打印为answer42
,那么您必须将其打印:
(format t "~a~a" (car *data*) (cdr *data*))
您想要的操作将是这样的:
(defun inc-number (cell)
"Please give me a better name and describe here what I do"
(cons (car cell)
(inc (cdr cell))))
也就是说,当然有可能实现您想要的目标:
使用string
可以得到符号的字符串表示形式,使用string
可以(相反)获得相反的结果。在这两者之间,您可以随意操作字符串,包括将其拆分,将其转换为数字等。
这可以在MACLISP和INTERLISP中实现。转换列表中的符号的功能在MACLISP中称为“爆炸”,在INTERLISP中称为“解压”。转换符号列表的函数在MACLISP中称为“内爆”,在INTERLISP中称为“打包”。如果您的系统具有GENSYM函数(一种用于创建符号的函数,因为将符号用作变量,则必须即时创建它们,特别是在宏编程中),它可能具有类似于'implode'和'爆炸'。