Files
cs5/09-tidbit/10.rkt
T
2026-02-11 09:14:12 -05:00

59 lines
1.4 KiB
Racket

#lang racket
;; example of currying: turning n-ary functions into unary functions
#;((λ (a b c) (- (string-length a) (/ b c))) "foo" 8 2)
#;((((λ (a) (λ (b) (λ (c) (- (string-length a) (/ b c)))))
"foo")
8)
2)
;; A LExpr (Lambda expression) is one of:
;; - Symbol <- identifier
;; - (list 'λ (list Symbol) LExpr) <- function
;; - (list LExpr LExpr) <- application
;; An ILExpr (Index Lambda expression) is one of:
;; - Nat
;; - (list 'λ ILExpr)
;; - (list ILExpr ILExpr)
(define sample-lexpr
'((λ (x)
(λ (y)
(λ (x)
(y x))))
(λ (x) x)))
(define sample-ilexpr
'((λ (λ (λ (1 0))))
(λ 0)))
;; '()
#;(;; '()
(λ (x) ;; '(x)
(λ (y) ;; '(y x)
(λ (x);; '(x y x)
(y x))))
;; '()
(λ (x) ;; '(x)
x))
#;((λ (λ (λ (1 0))))
(λ 0))
;; indexify : LExpr -> ILExpr
;; Make an index expression out of the lexpr
(define (indexify lexpr)
(define (indexify/args arguments lexpr)
(match lexpr
[(? symbol? identifier)
(or (index-of arguments identifier)
(error "unbound identifier"))]
[(list 'λ (list (? symbol? argument)) body)
(list 'λ (indexify/args (cons argument arguments) body))]
[(list func arg)
(list (indexify/args arguments func)
(indexify/args arguments arg))]))
(indexify/args '() lexpr))
(equal? (indexify sample-lexpr) sample-ilexpr)
(indexify 'x)