Что является ближайшим эквивалентом цикла for в Racket-sdp?

Является ли рекурсия единственным способом написать что-то вроде цикла for на диалекте Racket sdp ("Schreibe dein Programm!"), в котором "(for)" не имеет значения, или есть более "эффективный" или более простой способ сделать так?

Как будет выглядеть ближайший эквивалент цикла C++ for(i = 0 , i < 100, i++) в коде Racket-sdp?

Как я это делал до сих пор:

(: my-loop (natural -> %a))
(define my-loop
    (lambda (i)
        (cond
            [(< i 100) (my-loop (+ i 1))] ; <-- count up by one till 99 is reached
            [else "done"] ; <-- end
        )))

(my-loop 0)

Обновлено:

Это скорее общий вопрос. Если бы я написал, скажем, библиотеку raket, содержащую общую функцию, ее можно было бы использовать так:

(for 0 (< i 100) (+ i 1) (func i))

в моих программах, которые представляют собой цикл for, который работает с заданной функцией в качестве «тела», будет ли способ реализовать это правильно?

Самое близкое к циклу for в Racket — это... цикл for.

Óscar López 17.01.2023 12:32

@ ÓscarLópez Извините, я забыл упомянуть, что я работаю с образовательным диалектом sdp («Schreibe dein Programm!»), который является требованием моего университета (по какой-то причине) для этого проекта. Я отредактировал вопрос соответственно!

Caeleste 17.01.2023 14:04

Это общий вопрос или вы пытаетесь решить какую-то конкретную проблему? В некоторых случаях вы можете заменить рекурсию такими функциями, как map, for-each, filter или fold (и некоторые варианты sdp включают их).

Martin Půda 17.01.2023 15:15

Ваш курс, скорее всего, предполагает, что вы научитесь мыслить рекурсивно, а не пытаетесь обойти это и достичь своей зоны комфорта. (Вы можете добавлять циклы и другие структуры управления с помощью макросов — процедур недостаточно — но я не думаю, что в SdP есть макросы.)

molbdnilo 17.01.2023 15:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

[Профессор упомянутого курса здесь.]

Рекурсия действительно является единственным способом выражения повторяющихся вычислений на диалекте Racket, который мы изучаем. (Да, это по замыслу.)

Тем не менее, функции более высокого порядка (и рекурсия) предоставляют все, что вам нужно для создания ваших собственных «циклоподобных управляющих структур». Возьмем, к примеру, следующий HOF, моделирующий петлю repeat-until:

(: until ((%a -> boolean) (%a -> %a) %a -> %a))
(define until
  (lambda (done? f x)
    (if (done? x)
        x
        (until done? f (f x)))))

Обратите внимание, что функция until является хвостовой рекурсией. Вы можете ожидать, что во время выполнения она действительно будет вести себя как цикл — умный компилятор даже транслирует такую ​​функцию, используя простые jump инструкции. (Мы обсудим это в следующей главе 12.)

Включает ли этот язык do? Все еще рекурсия под капотом, но ближе к стилю C для цикла в организации.

Shawn 17.01.2023 19:29

Это не. Мы следуем диалекту Schreib Dein Programm (очень вдохновленному HtDP): docs.racket-lang.org/deinprogramm/sdp-vanilla.html

Torsten Grust 17.01.2023 19:32

@Shawn do также не является примитивной формой в Scheme. Он получен из макроса, который решает его с помощью рекурсии

Sylwester 18.01.2023 11:34

@Sylwester Все еще рекурсия под капотом

Shawn 18.01.2023 20:58

Вы можете сделать цикл for высокого порядка. Вот простой пример:

(define (for start end f)
  (define (loop i)
    (when (< i end)
      (f i)
      (loop (+ i 1))))
  (loop start))

(for 0 10 (λ (i) (displayln i)))

Вы можете сделать это более общим, если вы используете функцию next вместо (+ i 1) и используете функцию while-predicate? вместо (< i end).

Другие вопросы по теме