#lang racket (require rackunit) ;; --------------------------------------------------------------------- ;; a function that translates the Python-like for syntax ;; into an equivalent map expression ;; --------------------------------------------------------------------- (define for-to-map (lambda (for-exp) (let ((var (second for-exp)) (lst (fourth for-exp)) (exp (sixth for-exp))) (list 'map (list 'lambda (list var) exp) lst)))) (check-equal? (for-to-map '(for i in lst : (sqrt i))) '(map (lambda (i) (sqrt i)) lst)) (check-equal? (for-to-map '(for i in (range 0 10) : (sqrt i))) '(map (lambda (i) (sqrt i)) (range 0 10))) (check-equal? (for-to-map '(for i in (range 0 10): (sqrt i))) '(map (lambda (i) (sqrt i)) (range 0 10))) ;; --------------------------------------------------------------------- ;; a Racket macro that defines the Python-like for syntax as syntactic ;; sugar for an equivalent map expression ;; --------------------------------------------------------------------- (define-syntax for-p (syntax-rules (in :) ( (for-p var in lst : exp) (map (lambda (var) exp) lst) ) )) (check-equal? (for-p i in (range 0 10): (sqrt i)) '(0 1 1.4142135623730951 1.7320508075688772 2 2.23606797749979 2.449489742783178 2.6457513110645907 2.8284271247461903 3)) ;; ---------------------------------------------------------------------