branch: externals/beardbolt
commit a0527f16afbfbb59b28e32d4efdc8ef709f927fe
Author: Jay Kamat <[email protected]>
Commit: Jay Kamat <[email protected]>
Add very basic support for common lisp
---
rmsbolt.el | 49 ++++++++++++++++++++++++++++++++++++++++++++++++-
starters/rmsbolt.lisp | 16 ++++++++++++++++
2 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/rmsbolt.el b/rmsbolt.el
index 6ed6cd4b39..0de2ad2637 100644
--- a/rmsbolt.el
+++ b/rmsbolt.el
@@ -273,6 +273,34 @@ Needed as ocaml cannot output asm to a non-hardcoded file"
" "))
" ")))
cmd))
+(cl-defun rmsbolt--lisp-compile-cmd (&key src-buffer)
+ "Process a compile command for common lisp.
+
+Assumes function name to dissasemble is 'main'."
+ (let* ((cmd (buffer-local-value 'rmsbolt-command src-buffer))
+ (interpreter (cl-first (split-string cmd nil t)))
+ (disass-eval "\"(disassemble 'main)\"")
+ (disass-eval-unquoted "(disassemble 'main)"))
+ (pcase interpreter
+ ("sbcl"
+ (mapconcat 'identity
+ (list cmd "--noinform" "--load"
+ (buffer-file-name)
+ "--eval" disass-eval "--non-interactive"
+ ;; Remove leading comments
+ "|" "sed" "'s/^;\s//'" ">"
+ (rmsbolt-output-filename src-buffer))
+ " "))
+ ("clisp"
+ (mapconcat 'identity
+ (list cmd "-q" "-x"
+ (concat
+ "\"(load \\\"" (buffer-file-name) "\\\") "
disass-eval-unquoted "\"")
+ ">" (rmsbolt-output-filename src-buffer))
+ " "))
+ (_
+ (error "This Common Lisp interpreter is not supported")))))
+
(defvar rmsbolt--hidden-func-c
(rx bol (or (and "__" (0+ any))
(and "_" (or "init" "start" "fini"))
@@ -326,7 +354,17 @@ Needed as ocaml cannot output asm to a non-hardcoded file"
:supports-disass t
:starter-file-name "rmsbolt.ml"
:compile-cmd-function #'rmsbolt--ocaml-compile-cmd
- :disass-hidden-funcs rmsbolt--hidden-func-ocaml))))
+ :disass-hidden-funcs rmsbolt--hidden-func-ocaml))
+ (lisp-mode
+ . ,(make-rmsbolt-lang :mode 'lisp-mode ;; Assume common lisp..
+ :compile-cmd "sbcl"
+ :supports-asm t
+ :supports-disass nil
+ :objdumper 'cat
+ :starter-file-name "rmsbolt.lisp"
+ :compile-cmd-function #'rmsbolt--lisp-compile-cmd
+ :disass-hidden-funcs nil))
+ ))
;;;; Macros
@@ -648,6 +686,14 @@ Needed as ocaml cannot output asm to a non-hardcoded file"
"att")
">" (rmsbolt-output-filename src-buffer t))
" ")))
+ ('cat
+ (setq cmd
+ (mapconcat 'identity
+ (list cmd
+ "&&" "mv"
+ (rmsbolt-output-filename src-buffer)
+ (rmsbolt-output-filename src-buffer t))
+ " ")))
(_
(error "Objdumper not recognized"))))
(setq-local rmsbolt-src-buffer src-buffer)
@@ -709,6 +755,7 @@ Needed as ocaml cannot output asm to a non-hardcoded file"
(rmsbolt-defstarter "c" 'c-mode)
(rmsbolt-defstarter "c++" 'c++-mode)
(rmsbolt-defstarter "ocaml" 'tuareg-mode)
+(rmsbolt-defstarter "cl" 'lisp-mode)
;;;; Font lock matcher
(defun rmsbolt--goto-line (line)
diff --git a/starters/rmsbolt.lisp b/starters/rmsbolt.lisp
new file mode 100644
index 0000000000..af964082e0
--- /dev/null
+++ b/starters/rmsbolt.lisp
@@ -0,0 +1,16 @@
+;; Common Lisp rmsbolt starter file
+
+;; rmsbolt ONLY DISASSEMBLES THE MAIN FUNCTION.
+;; Please ensure you have a main function defined,
+;; and place all your code inside of it!
+
+;; Local Variables:
+;; rmsbolt-command: "sbcl"
+;; End:
+
+(defun main ()
+ (defun add (a b)
+ ;; (declare (optimize (speed 3) (safety 0) (debug 0)))
+ ;; (declare (type fixnum a b))
+ (+ a b))
+ (add 2 3))