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:
José L. Doménech 2017-07-24 11:56:52 +02:00 committed by Nicolas Goaziou
parent 6b9f9e9aff
commit bb6e40b086
2 changed files with 65 additions and 20 deletions

View File

@ -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~

View File

@ -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,24 +207,28 @@ 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)))) geiser-default-implementation
geiser-default-implementation (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
(org-babel-pick-name (cdr (assq :colname-names params)) (let ((table
(cdr (assq :colnames params))) (org-babel-reassemble-table
(org-babel-pick-name (cdr (assq :rowname-names params)) result
(cdr (assq :rownames params))))))) (org-babel-pick-name (cdr (assq :colname-names params))
(cdr (assq :colnames params)))
(org-babel-pick-name (cdr (assq :rowname-names params))
(cdr (assq :rownames params))))))
(org-babel-scheme--table-or-string table))))))
(provide 'ob-scheme) (provide 'ob-scheme)