This repository was archived by the owner on Nov 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodule-manager.lisp
More file actions
39 lines (34 loc) · 1.43 KB
/
module-manager.lisp
File metadata and controls
39 lines (34 loc) · 1.43 KB
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
;;; (c) 2019 Daniel Kochmański
;;; (l) BSD-2-Clause
(in-package #:ecrepl)
(defvar *all-headers* (list (format nil "/* ecrepl header file */~%")))
(defvar *all-sources* (list (format nil "/* ecrepl source file */~%")))
(defvar *all-c-forms* (list (format nil "/* ecrepl c-form list */~%")))
(defun cexec (commands)
nil)
(defmacro ensure-list (x)
`(if (listp ,x)
,x
(list ,x)))
(defun ceval (headers sources c-forms)
(setf headers (ensure-list headers)
sources (ensure-list sources)
c-forms (ensure-list c-forms))
(setf *all-headers* (nconc *all-headers* headers)
*all-sources* (nconc *all-sources* sources)
*all-c-forms* (nconc *all-c-forms* c-forms))
(unless (or sources c-forms)
(return-from ceval nil))
(when *debug*
(format *debug-io* "compiling program~%---~%~a~%---~%"
(concatenate 'string
(apply #'concatenate 'string *all-headers*)
(format nil "~%/* end of header file */~%")
(apply #'concatenate 'string sources)
(format nil "~%~%void <gensym> () { ~{~a~} }~%" c-forms))))
(let* ((*compile-verbose* nil)
(function (compile nil `(lambda ()
(ffi:clines ,@*all-headers* ,@sources)
(ffi:c-inline nil nil :void ,(format nil "~{~a~^~%~}" c-forms))))))
(prog1 function
(funcall function))))