Guest User

Untitled

a guest
Oct 23rd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.32 KB | None | 0 0
  1. #lang racket
  2. ;; let's figure out what the first arg to datum->syntax really means.
  3.  
  4. ;; simplifies defining a lambda
  5. (define-syntax l
  6. (lambda (x)
  7. (syntax-case x ()
  8. ((l e ...)
  9. (with-syntax ((var (datum->syntax #'l 'x)))
  10. #'(lambda (var) e ...))))))
  11.  
  12. ((l (+ x 1)) 2) ; => 3
  13.  
  14. ;; lets you define lambdas with a variable number of args.
  15. ;; args start with "x", then wrap around to "a" after hitting z.
  16. ;; note: (l x) is equivalent to (l 1 x)
  17. ;; (l (+ x 1)) => (lambda (x) (+ x 1))
  18. ;; (l 2 (+ x y)) => (lambda (x y) (+ x y))
  19. ;; (l 5 (+ x y z a b)) => (lambda (x y z a b) (+ x y z a b))
  20. (define-syntax lx
  21. (lambda (x)
  22. (syntax-case x ()
  23. ((lx n e ...)
  24. (number? (syntax->datum #'n))
  25. (let ((letters '(x y z a b c d e f g h i j k l m n o p q r s t u v w)))
  26. (with-syntax
  27. ((vars (datum->syntax #'lx
  28. (reverse
  29. (memq
  30. (list-ref letters (- (syntax->datum #'n) 1))
  31. (reverse letters))))))
  32. #'(lambda vars e ...))))
  33. ((l e ...)
  34. (with-syntax ((var (datum->syntax #'l 'x)))
  35. #'(lambda (var) e ...))))))
  36.  
  37. ((lx 3 (+ x y z)) 1 2 3) ;=> 6
  38. ((lx 6 (+ x y z a b c)) 1 2 3 4 5 6) ;=> 21
  39. ((lx (+ x 1)) 2) ; => 3
Add Comment
Please, Sign In to add comment