Guest User

Untitled

a guest
Oct 23rd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 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 l0
  21. (lambda (x)
  22. (syntax-case x ()
  23. ((l0 n e ...)
  24. (with-syntax
  25. ((vars (datum->syntax #'l0
  26. (reverse (memq (list-ref '(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) (- (syntax->datum #'n) 1)) '(w v u t s r q p o n m l k j i h g f e d c b a z y x))))))
  27. #'(lambda vars e ...))))))
  28.  
  29. ((l0 4 (+ x y a)) 2 3 4 5)
  30.  
  31. ;; let's simplify!
  32. (define-syntax lx
  33. (lambda (x)
  34. (syntax-case x ()
  35. ((lx n e ...)
  36. (number? (syntax->datum #'n))
  37. (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)))
  38. (with-syntax
  39. ((vars (datum->syntax #'lx
  40. (reverse
  41. (memq
  42. (list-ref letters (- (syntax->datum #'n) 1))
  43. (reverse letters))))))
  44. #'(lambda vars e ...))))
  45. ((l e ...)
  46. (with-syntax ((var (datum->syntax #'l 'x)))
  47. #'(lambda (var) e ...))))))
  48.  
  49. ((lx 3 (+ x y z)) 1 2 3) ;=> 6
  50. ((lx 6 (+ x y z a b c)) 1 2 3 4 5 6) ;=> 21
  51. ((lx (+ x 1)) 2) ; => 3
Add Comment
Please, Sign In to add comment