如何在普通Lisp中将char转换为符号?

时间:2019-10-29 09:12:15

标签: list lisp common-lisp

这里完全是Lisp初学者。

我想知道如何将字符转换为符号。我只想将#\a转换为a

这是我到目前为止所做的:

(defun convert(char)
(if(eq char #\a)
    (setq char 'a))
    char)

这实际上是可行的,但是我不想添加26个条件(字母字母)并编写一个长代码。

我还想知道通用的lisp中是否有任何功能可以将字符列表转换为符号列表,例如:(#\h #\e #\l #\l #\o)(h e l l o)?我发现与此相关的internmake-symbol,但是它们需要字符串作为参数。

3 个答案:

答案 0 :(得分:4)

CL-USER 230 > (intern (string #\Q))
Q
NIL

CL-USER 231 > (intern (string #\q))
\q
NIL

顺便说一句,您的代码有很多必要的改进:

(defun convert(char)   ; 
(if(eq char #\a)       ; use EQL instead of EQ for characters
                       ; indentation is wrong
    (setq char 'a))    ; indentation is wrong
    char)              ; indentation is wrong

最好写成:

(defun convert (char)
  (if (eql char #\a)
      'a
      char))

(defun convert (char)
  (case char
    (#\a 'a)
    (#\b 'b)
    (otherwise char)))

如上所述,“实际”解决方案是:

(defun convert (char)
  (intern (string char)))

答案 1 :(得分:1)

(defun converter (c)
  (if (characterp c)
      (make-symbol (string c))))

您可以使用make-symbol并将符号转换为字符串。

(setq my-sym (converter #\a))

答案 2 :(得分:0)

过一会儿回答我自己的问题:

我还想知道通用lisp中是否有任何功能可以将字符列表转换为符号列表,例如:(#\ h#\ e#\ l#\ l#\ o)到(hello)?< / em>

我可以使用以下转换功能将单个字符转换为符号:

(defun convert (c)
    (if (characterp c)
        (intern (string c))))

由于LISP的主要思想之一是“处理列表”,因此我可以使用map函数之一将一个操作应用于列表的每个元素。

(mapcar #'convert '(#\h #\e #\l #\l #\o))

此处mapcar函数将显示符号列表:

(|h| |e| |l| |l| |o|)