changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > demo / annotate src/tk/rs.lisp

changeset 26: 2015d7277629
parent: src/rs.lisp@ba323d8c0f93
author: ellis <ellis@rwest.io>
date: Mon, 05 Jun 2023 19:59:26 -0400
permissions: -rw-r--r--
description: refactor 01
13
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
1
 ;;; RUST DSL
14
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
2
 
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
3
 ;; So basically, this was born out of personal frustration with how
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
4
 ;; cbindgen and Rust macros work (they don't). Rust macros in general
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
5
 ;; are something of a pain in my opinion, so I thought why not just
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
6
 ;; generate Rust code from Lisp instead?
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
7
 
13
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
8
 (in-package :demo)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
9
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
10
 (defvar *cargo-target* #p"/Users/ellis/dev/otom8/demo/target/")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
11
 (defvar *rs-macros* nil)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
12
 
14
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
13
 ;; TODO gensyms
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
14
 (defmacro rs-defmacro (name args &body body)
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
15
   "Define a macro which can be used within the body of a 'with-rs' form."
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
16
   `(prog1
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
17
        (defmacro ,name ,@(mapcar #`(,a1) args) ,@body)
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
18
      (push ',name *rs-macros*)))
2bbf5ce73537 rs updates
ellis <ellis@rwest.io>
parents: 13
diff changeset
19
 
13
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
20
 (defun rs-mod-form (crate &optional mods pub)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
21
   "Generate a basic mod form (CRATE . [MODS] [PUB])"
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
22
     `(,crate ,mods ,pub))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
23
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
24
 (defmacro with-rs-env (imports &body body)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
25
   "Generate an environment for use within a Rust generator macro."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
26
   `(let ((imports ,(mapcar #'rs-mod-form imports)))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
27
      (format nil "~A~&~A" imports ',body)))
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
 (defun rs-use (crate &optional mods pub)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
30
   "Generate a single Rust use statement."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
31
   (concatenate
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
32
    'string
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
33
    (if pub "pub " "")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
34
    "use " crate "::{"
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
35
    (cond
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
36
      ((consp mods)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
37
       (reduce
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
38
        (lambda (x y) (format nil "~A,~A" x y))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
39
        mods))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
40
      (t mods))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
41
    "};"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
42
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
43
 (defun rs-mod (mod &optional pub)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
44
   "Generate a single Rust mod statement."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
45
   (concatenate
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
46
    'string
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
47
    (if pub "pub " "")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
48
    "mod " mod ";"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
49
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
50
 (defun rs-imports (&rest imports)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
51
   "Generate a string of Rust 'use' statements."
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 imports)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
54
      (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
55
     (t imports)))
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
 (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
58
   "Generate a Rust extern 'C' fn."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
59
   `(concatenate
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
60
    'string
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
61
    ,(when no-mangle (format nil "#[no_mangle]~&"))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
62
    ,(when pub "pub ")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
63
    ,(when unsafe "unsafe ")
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
64
    "extern \"C\" fn " ,name "("
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
65
    ,(cond
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
66
       ((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
67
       (t args))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
68
    ")" "{" ,@body "}"))
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
 (defun rs-obj-impl (obj)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
71
   "Implement Objective for give OBJ."
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
72
   (format nil "impl Objective for ~A {};" obj))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
73
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
74
 ;; (defun rs-macroexpand-1 (form &optional env))
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
75
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
76
 ;; (defun rs-macroexpand (env &rest body)
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
77
 
1fedeaa5bfc5 tweaks to ffi and makefile
ellis <ellis@rwest.io>
parents:
diff changeset
78
 ;;;