Как извлечь первый символ символа в схеме?

Я хочу, чтобы он извлек все слова, в которых есть буква e. например.

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

В лекции Беркли 61a используется (first 'word) для извлечения первого символа слова. Однако DrScheme кричит на меня, когда я пытаюсь это сделать. Как взять первый символ слова? нравится

(first 'word)->'w.

person unj2    schedule 02.06.2009    source источник
comment
Berkeley 61A не использует стандартную версию Scheme; они добавляют немного больше поддержки в виде библиотеки Simply Scheme. См.: planet.plt-scheme.org/package-source/dyoo/simply-scheme.plt/2/1/, который обеспечивает поддержку Racket.   -  person dyoo    schedule 27.08.2011


Ответы (3)


Вам нужно будет явно преобразовать его в строку:

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

(Я не уверен, что first работает со строками. Вы можете использовать string->list для преобразования в список, а затем взять first, если это не так.)

РЕДАКТИРОВАТЬ: может быть проще передать строки вместо символов в первую очередь - для обозначения строки используйте двойные кавычки (например, (ewords '("i" "e" "ee" "o" "oo")).) Я не знаю, является ли это вашим намерением, но поскольку вы учитесь, Я подумал, что должен упомянуть различие.

person mqp    schedule 02.06.2009
comment
Хм, использование строк звучит хорошо, но я действительно хотел использовать символы. Спасибо, в любом случае. - person unj2; 03.06.2009
comment
Да, список строк нужен. - person Jay Kominek; 03.06.2009

Символы в первую очередь предназначены для атомарных значений, т. е. обычно их не разбирают и не исследуют. Если вы действительно хотите это сделать, вы должны сначала выполнить некоторые преобразования типов:

    ; #\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
person Jonas    schedule 03.06.2009

Это зависит от того, каково определение данных для «слова»?

Это последовательность символов (она же строка)? Это список персонажей? Список строк? Список символов?

Вот функция, которая соответствует вашим критериям, но, как вы видите, она запутана, и мне интересно, действительно ли это то, что вы хотите:

; 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))))
person grettke    schedule 11.06.2009