«для каждого» или «каждого» ключевых слов в схеме - PullRequest
2 голосов
/ 13 ноября 2009

Есть ли в схеме for петля или for each петля?

Я искал вокруг и обнаружил, что есть ключевое слово "every", но в используемом мной языке компилятора схемы эта функция не встроена заранее. найти здесь

(define (first-letters sent)
  (every first sent))

> (first-letters '(here comes the sun))
(H C T S)

Как мне переписать функцию every? используя другую предопределенную функцию. Язык, который я использую, находится в DrScheme - Основы языков программирования (3-е изд)

Я попробовал все предустановленные компиляторы в DrScheme, но ни один из них не может скомпилировать функцию every.

Есть идеи?

Ответы [ 4 ]

6 голосов
/ 13 ноября 2009

Вы ищете map, хотя вы, вероятно, хотели бы знать, что Схема также имеет for-each. map делает именно то, что вы хотите с every. Он что-то делает с каждым элементом в списке, возвращая новый список результатов.

Вы могли бы даже сказать

(define every map)

Вы можете получить свою first функцию, написав

(define (first symbol)
  (string->symbol (string (string-ref (symbol->string symbol) 0))))

Хотя это плохой стиль Схемы. Это похоже на древний Лисп 60-х или 70-х годов, еще до того, как в языке появились строки. Во всяком случае, теперь вы можете сказать

(map first '(here comes everybody))
=> (h c e)

for-each создает некоторый побочный эффект для каждого элемента в списке:

(define initials (map first '(here comes everybody)))
(for-each display initials)
=> hce
2 голосов
/ 13 ноября 2009

Это может быть ответом на ваш вопрос.Функция map, принимает функцию и список (-ы) в качестве аргументов, применяет функцию к элементам списка, возвращает результаты.

1 голос
/ 30 января 2010

Это дополнение к сообщению Натана, которое является лучшим ответом для вас прямо сейчас ...

Если вы когда-нибудь перейдете на языки модулей scheme или scheme/base, вы получите доступ к армии PLT из for итераторов. Они больше похожи на циклы «для каждого», которые распространены в других языках. Искать for в документах:

(define (first symbol)
  (string->symbol (string (string-ref (symbol->string symbol) 0))))

(for/list ([symbol (in-list '(here comes everybody))])
  (first symbol))

=> '(h c e)
0 голосов
/ 13 ноября 2009

Зависит от того, на какую схему вы смотрите. Помимо "for-each" и "map", упомянутых выше (которые являются частью различных стандартов и, следовательно, присутствуют во всех реальных схемах), вы можете найти расширения, специфичные для реализации. Например, схема PLT имеет целый ряд таких форм, которые вы можете прочитать о здесь .

...