Цикл while в Racket

Напишите в Racket процедуру, которая действует как «циклы while» в таких языках, как Java. Для выполнения цикла while требуется два фрагмента кода: условие и тело. он запускает тело, затем снова пытается выполнить условие, снова запуская тело, если оно истинно. Это продолжается до тех пор, пока условие не вернет false.

вот как я начал на нем: потом я застрял.

(define (while condition body)
   (when (true? condition)
       (cons (proc body) (proc (rest body)))

person erick lema    schedule 26.02.2020    source источник
comment
Отвечает ли это на ваш вопрос? Пока макрос цикла в DrRacket   -  person Gwang-Jin Kim    schedule 27.02.2020
comment
это дублирующий вопрос. Прежде чем спрашивать, пожалуйста, найдите хотя бы SO для своего вопроса, пожалуйста.   -  person Gwang-Jin Kim    schedule 27.02.2020


Ответы (2)


condition и body — это процедуры, поэтому их нужно вызывать.

После вызова тела вы должны вызвать while рекурсивно, чтобы повторить.

(define (while condition body)
  (when (condition)
    (body)
    (while condition body)))

Вам не нужен true?, так как when просто проверяет, является ли условие #f или нет.

person Barmar    schedule 26.02.2020

в схеме время должно быть реализовано с помощью макроса, чтобы избежать оценки аргументов

(define-syntax while
  (syntax-rules ()
    ((_ pred b1 ...)
     (let loop () (when pred b1 ... (loop))))))
person Damien Mattei    schedule 14.08.2020
comment
ОП попросили написать процедуру, а не макрос; в этом случае condition и body представляют процедуры, т. е. они оцениваются как процедуры, которые должны использоваться внутри while. - person ad absurdum; 14.08.2020
comment
хорошо спасибо. но вы не можете выполнять настоящую процедуру While или Do with, если только, как вы говорите, состояние и тело не оцениваются как процедура. Но я действительно не вижу пользы, которую это может сделать. Первоначальный вопрос касался java, например, while, чтобы сделать то же самое по схеме, что и с макросом. - person Damien Mattei; 15.08.2020