Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

point free factorial

Name: Anonymous 2012-11-14 4:47


(define (reduce op id lis)
  (if (null? lis)
    id
    (reduce op (op id (car lis)) (cdr lis))))

(define (flip f)
  (lambda (x y) (f y x)))

(define (curry f . args)
  (lambda args2
    (apply f (append args args2))))

(define (evaluate f x) (f x))

(define (compose . fns)
  (let ((rev-fns (reverse fns)))
    (lambda args
      (reduce (flip evaluate) (apply (car rev-fns) args) (cdr rev-fns)))))

(define (collect . fns)
  (lambda args
    (map (curry (flip apply) args) fns)))

(define (wrap f . fns)
  (compose (curry apply f) (apply collect fns)))

(define (if-fn condition true false)
  (lambda args
    (if (apply condition args)
      (apply true args)
      (apply false args))))

(define (constant-fn value)
  (lambda args value))

(define (id x) x)

(define factorial-helper
  (if-fn (compose (curry = 0) caddr list)
    (compose cadr list)
    (compose (wrap apply car id) (collect car (wrap * cadr caddr) (compose (curry (flip -) 1) caddr)) list)))

(define factorial (curry factorial-helper factorial-helper 1))

Name: Anonymous 2012-11-15 7:08

wow, that's a lot of pointy functions for ``point-free'' code.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List