История изменений
Исправление monk, (текущая версия) :
Для ФП очень неудобным является случай, когда надо в зависимости от некоторых условий изменять много состояний.
Например надо разобрать дату по http://tools.ietf.org/search/rfc6265#section-5.1.1
Получается что-то вроде:
(let loop ([time #f] [day #f] [month #f] [year #f]
[tokens tokens])
(if (null? tokens)
(values time day month year)
(let ([token (car tokens)])
(cond
[(and (not time) (parse-time token)) => (λ (time) (loop time day month year (cdr tokens)))]
[(and (not day) (parse-day token)) => (λ (day) (loop time day month year (cdr tokens)))]
[(and (not month) (parse-month token)) => (λ (month) (loop time day month year (cdr tokens)))]
[(and (not year) (parse-year token)) => (λ (year) (loop time day month year (cdr tokens)))]
[else (loop time day month year (cdr tokens))]))))
В то время как не-ФП
(let ([time #f] [day #f] [month #f] [year #f])
(map
(λ (token)
(cond
[(and (not time) (parse-time token)) => (set! time <>)]
[(and (not day) (parse-day token)) => (set! day <>)]
[(and (not month) (parse-month token)) => (set! month <>)]
[(and (not year) (parse-year token)) => (set! year <>)]))
tokens)
(values time day month year))
Исходная версия monk, :
Для ФП очень неудобным является случай, когда надо в зависимости от некоторых учловий изменять много состояний.
Например надо разобрать дату по http://tools.ietf.org/search/rfc6265#section-5.1.1
Получается что-то вроде:
(let loop ([time #f] [day #f] [month #f] [year #f]
[tokens tokens])
(if (null? tokens)
(values time day month year)
(let ([token (car tokens)])
(cond
[(and (not time) (parse-time token)) => (λ (time) (loop time day month year (cdr tokens)))]
[(and (not day) (parse-day token)) => (λ (day) (loop time day month year (cdr tokens)))]
[(and (not month) (parse-month token)) => (λ (month) (loop time day month year (cdr tokens)))]
[(and (not year) (parse-year token)) => (λ (year) (loop time day month year (cdr tokens)))]
[else (loop time day month year (cdr tokens))]))))
В то время как не-ФП
(let ([time #f] [day #f] [month #f] [year #f])
(map
(λ (token)
(cond
[(and (not time) (parse-time token)) => (set! time <>)]
[(and (not day) (parse-day token)) => (set! day <>)]
[(and (not month) (parse-month token)) => (set! month <>)]
[(and (not year) (parse-year token)) => (set! year <>)]))
tokens)
(values time day month year))