changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate rs.lisp

changeset 13: 1fedeaa5bfc5
child: 2bbf5ce73537
author: ellis <ellis@rwest.io>
date: Fri, 19 May 2023 22:38:49 -0400
permissions: -rw-r--r--
description: tweaks to ffi and makefile
13
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; RUST DSL
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
2
 (in-package :demo)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
3
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
4
 (defvar *cargo-target* #p"/Users/ellis/dev/otom8/demo/target/")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
5
 (defvar *rs-macros* nil)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
6
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
7
 (defun rs-mod-form (crate &optional mods pub)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
8
   "Generate a basic mod form (CRATE . [MODS] [PUB])"
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
9
     `(,crate ,mods ,pub))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
10
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
11
 (defmacro with-rs-env (imports &body body)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
12
   "Generate an environment for use within a Rust generator macro."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
13
   `(let ((imports ,(mapcar #'rs-mod-form imports)))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
14
      (format nil "~A~&~A" imports ',body)))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
15
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
16
 (defun rs-use (crate &optional mods pub)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
17
   "Generate a single Rust use statement."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
18
   (concatenate
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
19
    'string
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
20
    (if pub "pub " "")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
21
    "use " crate "::{"
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
22
    (cond
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
23
      ((consp mods)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
24
       (reduce
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
25
        (lambda (x y) (format nil "~A,~A" x y))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
26
        mods))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
27
      (t mods))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
28
    "};"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
29
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
30
 (defun rs-mod (mod &optional pub)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
31
   "Generate a single Rust mod statement."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
32
   (concatenate
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
33
    'string
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
34
    (if pub "pub " "")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
35
    "mod " mod ";"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
36
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
37
 (defun rs-imports (&rest imports)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
38
   "Generate a string of Rust 'use' statements."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
39
   (cond
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
40
     ((consp imports)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
41
      (mapcar (lambda (x) (apply #'rs-use (apply #'rs-mod-form x))) imports))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
42
     (t imports)))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
43
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
44
 (defmacro rs-extern-c-fn (name args &optional pub unsafe no-mangle &body body)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
45
   "Generate a Rust extern 'C' fn."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
46
   `(concatenate
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
47
    'string
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
48
    ,(when no-mangle (format nil "#[no_mangle]~&"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
49
    ,(when pub "pub ")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
50
    ,(when unsafe "unsafe ")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
51
    "extern \"C\" fn " ,name "("
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
52
    ,(cond
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
53
       ((consp args) (reduce (lambda (x y) (format nil "~A,~A" x y)) args))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
54
       (t args))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
55
    ")" "{" ,@body "}"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
56
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
57
 (defun rs-obj-impl (obj)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
58
   "Implement Objective for give OBJ."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
59
   (format nil "impl Objective for ~A {};" obj))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
60
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
61
 ;; (defun rs-macroexpand-1 (form &optional env))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
62
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
63
 ;; (defun rs-macroexpand (env &rest body)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
64
 ;;   "Cbindgen is quite the menace and really doesn't like our macros used
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
65
 ;; to generate C FFI bindings. To compensate for this, we use a tool
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
66
 ;; called cargo-expand by the most excellent dtolnay which expands Rust
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
67
 ;; macros. The expansions are assembled into an equivalent Rust source
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
68
 ;; file which cbindgen won't get stuck in an infinite compile loop on.")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
69
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
70
 ;;;