String 在公共Lisp中从字符串中选择随机字符

String 在公共Lisp中从字符串中选择随机字符,string,list,common-lisp,String,List,Common Lisp,我正在学习CommonLisp,并作为一个入门项目编写一个简单的密码生成器 这是我的密码: (setq chars "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") (print (nth (random (length chars)) chars)) 但是使用CLISP我就可以 *** - NTH: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0

我正在学习CommonLisp,并作为一个入门项目编写一个简单的密码生成器

这是我的密码:

(setq chars
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
(print (nth (random (length chars)) chars))
但是使用CLISP我就可以

*** - NTH: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" is not a list

我以为Lisp中的每个字符串都是一个列表?如何将字符串“强制转换”到列表中?

Lisp是一个交互式系统。学习与REPL进行对话:

CL-USER>(abc类型)
(简单数组字符(3))

您应该从CLISP获得类似的结果


你能从这里开始吗?

字符串不是列表。并非所有内容都是Lisp中的列表;)

您可以使用
强制
创建字符列表
(强制“某些字符串”列表)

仅适用于列表。字符串不是列表,而是字符向量

这是你的电话号码
CHAR
是字符串的访问器

CL-USER 7 > (char "abc" 1)
#\b
因为字符串也是序列,所以所有序列操作都适用。请参阅:


我从CLISP获得
(SIMPLE-BASE-STRING 3)
。感谢
类型的
我将把它添加到我的工具箱:)然后我有另一个函数给你:
子类p
。尝试
(subsubip(“abc”)类型的数组)
(subsubip(“abc”)类型的列表)
。确实可以这样做,但这会创建一个中间列表,在这种情况下完全不需要。有一些函数可以访问字符串中的字符(更一般地说,还有向量和数组的元素)。@JoshuaTaylor:你说得对;只是把转换的可能性放在那里。谢谢,这是我一直在寻找的。在我的例子中,我还发现CLISP没有为其RNG设定种子,所以我不得不说
(setf*random state*(make random state t))
,否则每次都会得到相同的结果。查阅
CL-USER 8 > (elt "abc" 1)
#\b