如何在方案中提取符号的第一个字符?

时间:2009-06-02 21:40:16

标签: scheme racket

我想要它提取所有字母e的单词。 例如。

(ewords '(i e ee o oo)) -> '(e ee)

伯克利的61a讲座使用(第一个'单词)来提取单词的第一个字符。然而当我尝试这样做时,DrScheme对我尖叫。怎么取这个词的第一个字?喜欢

(first 'word)->'w.

3 个答案:

答案 0 :(得分:4)

您需要明确地将其转换为字符串:

(first (symbol->string 'word)) -> "w"

(我不确定first是否对字符串进行操作。您可以使用string->list转换为列表,然后点击first “T。)

编辑:首先传递字符串而不是符号可能更容易 - 指定字符串,使用双引号(例如(ewords '("i" "e" "ee" "o" "oo"))。)我不知道这是否是你的意图,但是既然你在学习,我想我应该提一下这个区别。

答案 1 :(得分:1)

符号主要是指原子值,即它们通常不被拆开和检查。如果你真的想这样做,你必须先做一些类型的转换:

    ; #\a -> a
    (define (char->symbol chr)
      (string->symbol (list->string (list chr))))

    ; abc -> (a b c)
    (define (symbol->list sym)
      (map char->symbol 
           (string->list (symbol->string sym))))

您现在可以使用first

    > (first (symbol->list 'word))
    w

答案 2 :(得分:0)

这取决于“单词”的数据定义是什么?

是一系列字符(又名字符串)?它是一个字符列表吗?字符串列表?符号列表?

这是一个符合您标准的功能,但正如您所看到的,它很复杂,我想知道它是否是您真正想要的:

; symbol->list-of-symbols : symbol -> (ListOf symbol)
; To destructure a symbol into a list of its constituent parts
(define (symbol->list-of-symbols sym)
  (map (lambda (s) (string->symbol (string s))) 
       (string->list (symbol->string sym))))