-
Notifications
You must be signed in to change notification settings - Fork 25
/
c-eval.sls
55 lines (47 loc) · 1.71 KB
/
c-eval.sls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
;;
;; Copyright 2016 Aldo Nicolas Bruno
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
;; You may obtain a copy of the License at
;;
;; http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.
(library (c-eval)
(export c-eval c-eval-printf c-eval-includes)
(import (chezscheme)
(posix)
(only (data-structures) string-intersperse ->string))
(define c-eval-includes (make-parameter '("stdio.h")))
(define (c-eval-printf format . values)
(c-eval (string-append "printf (\"" format "\"," (string-intersperse (map ->string values) ",") ");")))
(define (c-eval expr)
(with-mktemp
"/tmp/c-eval-XXXXXX"
(lambda (file)
(apply
(lambda (in out pid)
(for-each (lambda (x)
(fprintf out "#include <~a>~%" x)) (c-eval-includes))
(fprintf out "int main() {~%")
(fprintf out "~a~%" expr)
(fprintf out "}~%")
(close-port out)
(display (cond [(get-string-all in ) => (lambda (x) (if (eof-object? x) "" x))]))
(unless (zero? (wait-for-pid pid))
(errorf 'c-repl "compilation failed"))
(apply (lambda (p-in p-out p-pid)
(get-string-all p-in))
(process (format "~a" file))))
(process (format #f "gcc -o ~a -x c -" file))))))
) ;;library c-eval
#|
(import (c-eval))
(c-eval-includes '("stdio.h" "stdint.h"))
(string->number (c-eval-printf "%d" "sizeof (uint32_t)"))
|#