如何从Scheme中的多字符原子返回元素?
假设我定义了一个“x”,并给它赋值“Hello”(这是Scheme中的一种原子类型):如何从Scheme中的多字符原子返回元素?,scheme,Scheme,假设我定义了一个“x”,并给它赋值“Hello”(这是Scheme中的一种原子类型): 有没有办法返回原子的第二个元素,即我想返回字母“e”?当计算'hello时,它是一个名为hello的单态符号。您可以从symbol->string (symbol->string 'hello) ; ==> "hello" (list->string (list #\e)) ; ==> "e" 现在,字符串是字符序列: (string->list "hello") ; ==&
有没有办法返回原子的第二个元素,即我想返回字母“e”?当计算
'hello
时,它是一个名为hello
的单态符号。您可以从symbol->string
(symbol->string 'hello) ; ==> "hello"
(list->string (list #\e)) ; ==> "e"
现在,字符串是字符序列:
(string->list "hello") ; ==> (#\h #\e #\l #\l #\o)
您可以使用带有参数1(第一个是索引0)的list ref
或常用的cxr
来获取第二个字符
(list-ref '(#\h #\e #\l #\l #\o) 1) ; ==> #\e
如果您想要一个包含一个字母的字符串,您需要创建一个包含一个elmenet的列表,并将其从list->string
(symbol->string 'hello) ; ==> "hello"
(list->string (list #\e)) ; ==> "e"
如果您想要一个只有一个字母的符号,可以使用string->symbol
(string->symbol "e") ; ==> e
我不太确定你想要什么,但是如果你把所有的或者其中的一部分拼凑在一起,我敢打赌你可以做你想要的 将整个字符串转换为列表,然后只拾取所需的字符将产生不必要的垃圾进行收集。使用
string ref
更有效:
(string-ref (symbol->string 'Hello) 1) => #\e
如果您需要一个字符串而不是一个字符,就像Sylwester在上面的评论中提到的那样,您可以通过调用(string)
将其包装成一个字符串。或者:
(substring (symbol->string 'Hello) 1 2) => "e"
使用(string#\e)
而不是(list->string(list#\e))