(load "typecheck.scm")
(load "ast.scm")
+(load "platform.scm")
-(define target 'darwin)
+(define target host-os)
(define (emit . s)
(begin
(emit "not %rcx") ; -%rcx = strlen + 1
(emit "dec %rcx")
- (case target
- ('darwin
(emit "movq %rbx, %rsi") ; string addr
(emit "movq %rcx, %rdx") ; num bytes
(emit "movq $1, %rdi") ; file handle (stdout)
- (emit "movq $0x2000004, %rax")) ; syscall 4 (write)
- ('linux
- (emit "mov %rbx, %rsi") ; string addr
- (emit "mov %rcx, %rdx") ; num bytes
- (emit "mov $1, %rax") ; file handle (stdout)
- (emit "mov $1, %rdi"))) ; syscall 1 (write)
+ (case target
+ ('darwin (emit "mov $0x2000004, %rax")) ; syscall 4 (write)
+ ('linux (emit "mov $1, %rax"))) ; syscall 1 (write)
(emit "syscall"))
(define (range s n)
(else (error #f "don't know how to codegen this"))))
-(define (fold-map f x) (fold-left append '() (map f x)))
(define (free-vars prog)
(define bound '())
('+ "_add")
('- "_sub")
('* "_mul")
+ ('! "_not")
+ ('= "_eq")
('bool->int "_bool2int")
- (else (error #f "fill this out"))))
+ ('print "_print")
+ (else (error #f "don't know this builtin"))))
(define (builtin-args e)
(case e
('+ '(x y))
('- '(x y))
('* '(x y))
+ ('! '(x))
+ ('= '(x y))
('bool->int '(x))
- (else (error #f "fill this out"))))
+ ('print '(x))
+ (else (error #f "don't know this builtin"))))
(define (add-builtin-lambda e)
(let* [(label (builtin-name e))