; Композиция функций
(define (compose f g)  (lambda (x) (f (g x))))
; Частичное применение для функции с 2 параметрами
(define (partial2 f)
  (case-lambda
   ((x) (lambda (y) (f x y)))
   ((x y) (f x y))
  ))
; Частично применяемый plus
(define plus (partial2 (lambda (x y) (+ x y))))
((plus 2) 3)
(plus 2 3)
; Частично применяемый cons
(define part-cons (partial2 cons))
; Редукция переопределяется с использованием карринга
(define (part-foldr f s x) 
   (if (null? x) s
      ((f (car x)) (part-foldr f s (cdr x))) 
   ))
; Определение отображения через редукцию
(define part-map (partial2 
   (lambda (f x) (part-foldr (compose part-cons f) '() x))))
; Использование частнчного применения для создания новой функции
(define inc1 (part-map (plus 1)))
(inc1 '(2 7 5))
; Конвейер
(define (pipe x . fn)
  (if (null? fn) x
     (apply pipe ((car fn) x) (cdr fn))
  )
)
(define (mul2 x) (* x 2))
(define plus5 (plus 5))
; С использовнаием конвейера
(pipe 2 mul2 plus5)
; Без использования конвейера
(plus5 (mul2 2))
