|
|
|
|
#lang br
|
|
|
|
|
(require racket/function)
|
|
|
|
|
(provide (except-out (all-from-out br) + *)
|
|
|
|
|
(rename-out [my+ +] [my* *]) ⌊)
|
|
|
|
|
|
|
|
|
|
(define (⌊ largs rargs)
|
|
|
|
|
(let ([lenlargs (length largs)]
|
|
|
|
|
[lenrargs (length rargs)])
|
|
|
|
|
(cond
|
|
|
|
|
[(zero? lenlargs)
|
|
|
|
|
(map (compose1 inexact->exact floor) rargs)]
|
|
|
|
|
[(= lenlargs lenrargs)
|
|
|
|
|
(map min
|
|
|
|
|
largs rargs)])))
|
|
|
|
|
|
|
|
|
|
(define (my* largs rargs)
|
|
|
|
|
(let ([lenlargs (length largs)]
|
|
|
|
|
[lenrargs (length rargs)])
|
|
|
|
|
(cond
|
|
|
|
|
[(= lenlargs lenrargs)
|
|
|
|
|
(map * largs rargs)]
|
|
|
|
|
[(= 1 lenlargs)
|
|
|
|
|
(map (curry * (car largs)) rargs)]
|
|
|
|
|
[(= 1 lenrargs)
|
|
|
|
|
(my* rargs largs)]
|
|
|
|
|
[else
|
|
|
|
|
(error 'length-error)])))
|
|
|
|
|
|
|
|
|
|
(define (my+ largs rargs)
|
|
|
|
|
(let ([lenlargs (length largs)]
|
|
|
|
|
[lenrargs (length rargs)])
|
|
|
|
|
(cond
|
|
|
|
|
[(= lenlargs lenrargs)
|
|
|
|
|
(map + largs rargs)]
|
|
|
|
|
[(= 1 lenlargs)
|
|
|
|
|
(map (curry + (car largs)) rargs)]
|
|
|
|
|
[(= 1 lenrargs)
|
|
|
|
|
(my+ rargs largs)]
|
|
|
|
|
[else
|
|
|
|
|
(error 'length-error)])))
|
|
|
|
|
|
|
|
|
|
(module reader br
|
|
|
|
|
(provide read-syntax)
|
|
|
|
|
(define (read-syntax src-path src-port)
|
|
|
|
|
(define operators '(+ ⌊ *))
|
|
|
|
|
(define src-exprs (for/list ([ln (in-lines src-port)]
|
|
|
|
|
#:when (regexp-match #px"\\w" ln))
|
|
|
|
|
(format-datum '(begin ~a) ln)))
|
|
|
|
|
(with-syntax ([(src-expr ...) src-exprs])
|
|
|
|
|
(syntax->datum #'(module rapl "rapl.rkt"
|
|
|
|
|
(displayln 'src-expr) ...)))))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#;(module+ test
|
|
|
|
|
(require rackunit)
|
|
|
|
|
(check-equal? (+ '(4) '(7)) '(11))
|
|
|
|
|
(check-equal? (+ '(3) '(2 4 11 7 5)) '(5 7 14 10 8))
|
|
|
|
|
(check-equal? (+ '(6 3 8 1) '(3)) '(9 6 11 4))
|
|
|
|
|
(check-equal? (+ '(6 3 8 1) '(3 6 1 8)) '(9 9 9 9))
|
|
|
|
|
(check-exn exn:fail? (λ _ (+ '(6 8 1) '(3 6 1 8)))))
|