ob-scheme: Handle tables and :prologue params
* lisp/ob-scheme.el (org-babel-scheme-null-to): New variable. (org-babel-scheme--table-or-string): New function. (org-babel-execute-src-block): Changed to allow the return of a table for the output. (org-babel-expand-body:scheme) Add :prologue param support. TINYCHANGE
This commit is contained in:
parent
6b9f9e9aff
commit
bb6e40b086
18
etc/ORG-NEWS
18
etc/ORG-NEWS
|
@ -119,6 +119,24 @@ directories in published site-maps.
|
||||||
|
|
||||||
*** Babel
|
*** Babel
|
||||||
|
|
||||||
|
**** Scheme: support for tables
|
||||||
|
**** Scheme: new variable: ~org-babel-scheme-null-to~
|
||||||
|
|
||||||
|
This new custom option allows to use a empty list or null symbol to
|
||||||
|
format the table output, initially assigned to ~hlines~.
|
||||||
|
|
||||||
|
**** Scheme: new header ~:prologue~
|
||||||
|
|
||||||
|
A new block code header has been created for Org Babel that enables
|
||||||
|
developers to prepend code to the scheme block being processed.
|
||||||
|
|
||||||
|
Multiple ~:prologue~ headers can be added each of them using a string
|
||||||
|
with the content to be added.
|
||||||
|
|
||||||
|
The scheme blocks are prepared by surronding the code in the block
|
||||||
|
with a let form. The content of the ~:prologue~ headers are prepended
|
||||||
|
before this let form.
|
||||||
|
|
||||||
**** Support for hledger accounting reports added
|
**** Support for hledger accounting reports added
|
||||||
**** Clojure: new setting ~org-babel-clojure-sync-nrepl-timeout~
|
**** Clojure: new setting ~org-babel-clojure-sync-nrepl-timeout~
|
||||||
|
|
||||||
|
|
|
@ -51,14 +51,24 @@
|
||||||
(start end &optional and-go raw nomsg))
|
(start end &optional and-go raw nomsg))
|
||||||
(declare-function geiser-repl-exit "ext:geiser-repl" (&optional arg))
|
(declare-function geiser-repl-exit "ext:geiser-repl" (&optional arg))
|
||||||
|
|
||||||
|
(defcustom org-babel-scheme-null-to 'hline
|
||||||
|
"Replace `null' and empty lists in scheme tables with this before returning."
|
||||||
|
:group 'org-babel
|
||||||
|
:version "26.1"
|
||||||
|
:package-version '(Org . "9.1")
|
||||||
|
:type 'symbol)
|
||||||
|
|
||||||
(defvar org-babel-default-header-args:scheme '()
|
(defvar org-babel-default-header-args:scheme '()
|
||||||
"Default header arguments for scheme code blocks.")
|
"Default header arguments for scheme code blocks.")
|
||||||
|
|
||||||
(defun org-babel-expand-body:scheme (body params)
|
(defun org-babel-expand-body:scheme (body params)
|
||||||
"Expand BODY according to PARAMS, return the expanded body."
|
"Expand BODY according to PARAMS, return the expanded body."
|
||||||
(let ((vars (org-babel--get-vars params)))
|
(let ((vars (org-babel--get-vars params))
|
||||||
|
(prepends (cl-remove-if-not (lambda (x) (eq (car x) :prologue)) params)))
|
||||||
(if (> (length vars) 0)
|
(if (> (length vars) 0)
|
||||||
(concat "(let ("
|
(concat (mapconcat (lambda (p) (format "%s" (cdr p)))
|
||||||
|
prepends "\n ")
|
||||||
|
"(let ("
|
||||||
(mapconcat
|
(mapconcat
|
||||||
(lambda (var) (format "%S" (print `(,(car var) ',(cdr var)))))
|
(lambda (var) (format "%S" (print `(,(car var) ',(cdr var)))))
|
||||||
vars "\n ")
|
vars "\n ")
|
||||||
|
@ -176,6 +186,19 @@ is true; otherwise returns the last value."
|
||||||
result))))
|
result))))
|
||||||
result))
|
result))
|
||||||
|
|
||||||
|
(defun org-babel-scheme--table-or-string (results)
|
||||||
|
"Convert RESULTS into an appropriate elisp value.
|
||||||
|
If the results look like a list or tuple, then convert them into an
|
||||||
|
Emacs-lisp table, otherwise return the results as a string."
|
||||||
|
(let ((res (org-babel-script-escape results)))
|
||||||
|
(cond ((listp res)
|
||||||
|
(mapcar (lambda (el)
|
||||||
|
(if (or (null el) (eq el 'null))
|
||||||
|
org-babel-scheme-null-to
|
||||||
|
el))
|
||||||
|
res))
|
||||||
|
(t res))))
|
||||||
|
|
||||||
(defun org-babel-execute:scheme (body params)
|
(defun org-babel-execute:scheme (body params)
|
||||||
"Execute a block of Scheme code with org-babel.
|
"Execute a block of Scheme code with org-babel.
|
||||||
This function is called by `org-babel-execute-src-block'"
|
This function is called by `org-babel-execute-src-block'"
|
||||||
|
@ -184,7 +207,6 @@ This function is called by `org-babel-execute-src-block'"
|
||||||
"^ ?\\*\\([^*]+\\)\\*" "\\1"
|
"^ ?\\*\\([^*]+\\)\\*" "\\1"
|
||||||
(buffer-name source-buffer))))
|
(buffer-name source-buffer))))
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(org-babel-reassemble-table
|
|
||||||
(let* ((result-type (cdr (assq :result-type params)))
|
(let* ((result-type (cdr (assq :result-type params)))
|
||||||
(impl (or (when (cdr (assq :scheme params))
|
(impl (or (when (cdr (assq :scheme params))
|
||||||
(intern (cdr (assq :scheme params))))
|
(intern (cdr (assq :scheme params))))
|
||||||
|
@ -192,16 +214,21 @@ This function is called by `org-babel-execute-src-block'"
|
||||||
(car geiser-active-implementations)))
|
(car geiser-active-implementations)))
|
||||||
(session (org-babel-scheme-make-session-name
|
(session (org-babel-scheme-make-session-name
|
||||||
source-buffer-name (cdr (assq :session params)) impl))
|
source-buffer-name (cdr (assq :session params)) impl))
|
||||||
(full-body (org-babel-expand-body:scheme body params)))
|
(full-body (org-babel-expand-body:scheme body params))
|
||||||
|
(result
|
||||||
(org-babel-scheme-execute-with-geiser
|
(org-babel-scheme-execute-with-geiser
|
||||||
full-body ; code
|
full-body ; code
|
||||||
(string= result-type "output") ; output?
|
(string= result-type "output") ; output?
|
||||||
impl ; implementation
|
impl ; implementation
|
||||||
(and (not (string= session "none")) session))) ; session
|
(and (not (string= session "none")) session)))) ; session
|
||||||
|
(let ((table
|
||||||
|
(org-babel-reassemble-table
|
||||||
|
result
|
||||||
(org-babel-pick-name (cdr (assq :colname-names params))
|
(org-babel-pick-name (cdr (assq :colname-names params))
|
||||||
(cdr (assq :colnames params)))
|
(cdr (assq :colnames params)))
|
||||||
(org-babel-pick-name (cdr (assq :rowname-names params))
|
(org-babel-pick-name (cdr (assq :rowname-names params))
|
||||||
(cdr (assq :rownames params)))))))
|
(cdr (assq :rownames params))))))
|
||||||
|
(org-babel-scheme--table-or-string table))))))
|
||||||
|
|
||||||
(provide 'ob-scheme)
|
(provide 'ob-scheme)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue