LINUX.ORG.RU

История изменений

Исправление 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))
гораздо лаконичней и очевидней