On Sun, 23 Jul 2017 11:32:14 +0200, Nicolas Goaziou wrote: Hello > > Hello, > > "José L. Doménech" <domenechjo...@gmail.com> writes: > > > Thank you. Some comments follow. > > > :version "26.1" > :package-version '(Org . "9.1") >
Done. > > (eq el '()) -> (null el) > Done. > > The parenthesis needs to be moved at the end of the line above. > Done. > Would you mind also providing an ORG-NEWS entry for that change? > No, but I don't know what is the preferred format for the entries. So instead of a patch i send the complete entries. Also I have not explain why I added the :prologue header. I think it is general enough to be used in more creative ways than mine. ** New Features *** Babel ***** 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 function: ~org-babel-scheme-table-or-string~ New helper function to convert the return value from the scheme block to a table or a string. ***** 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. The Changelog entry: Allows scheme code blocks to return a table and add a :prologue param to the scheme blocks. All :prologue params are prepended to the body of code. * lisp/ob-scheme.el (org-babel-scheme-null-to): New custom option that allows to use a empty list or null symbol to format the table output, initially assigned to 'hlines. (org-babel-scheme-table-or-string): New helper function to convert the return value from the block to a table or a string. (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. A improved Changelog entry: Allows scheme code blocks to return a table and add a :prologue param to the scheme blocks. All :prologue params are prepended to the body of code. * lisp/ob-scheme.el (org-babel-scheme-null-to): New custom option that allows to use a empty list or null symbol to format the table output, initially assigned to 'hlines. (org-babel-scheme-table-or-string): New helper function to convert the return value from the block to a table or a string. (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. > Regards, > > -- > Nicolas Goaziou Thank you, José L. Doménech The modified patch:
diff --git a/lisp/ob-scheme.el b/lisp/ob-scheme.el index cd8c386..3c0500e 100644 --- a/lisp/ob-scheme.el +++ b/lisp/ob-scheme.el @@ -51,14 +51,24 @@ (start end &optional and-go raw nomsg)) (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 '() "Default header arguments for scheme code blocks.") (defun org-babel-expand-body:scheme (body params) "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) - (concat "(let (" + (concat (mapconcat (lambda (p) (format "%s" (cdr p))) + prepends "\n ") + "(let (" (mapconcat (lambda (var) (format "%S" (print `(,(car var) ',(cdr var))))) vars "\n ") @@ -176,6 +186,20 @@ is true; otherwise returns the last value." 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) "Execute a block of Scheme code with org-babel. This function is called by `org-babel-execute-src-block'" @@ -184,7 +208,6 @@ This function is called by `org-babel-execute-src-block'" "^ ?\\*\\([^*]+\\)\\*" "\\1" (buffer-name source-buffer)))) (save-excursion - (org-babel-reassemble-table (let* ((result-type (cdr (assq :result-type params))) (impl (or (when (cdr (assq :scheme params)) (intern (cdr (assq :scheme params)))) @@ -192,16 +215,21 @@ This function is called by `org-babel-execute-src-block'" (car geiser-active-implementations))) (session (org-babel-scheme-make-session-name source-buffer-name (cdr (assq :session params)) impl)) - (full-body (org-babel-expand-body:scheme body params))) - (org-babel-scheme-execute-with-geiser - full-body ; code - (string= result-type "output") ; output? - impl ; implementation - (and (not (string= session "none")) session))) ; session - (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))))))) + (full-body (org-babel-expand-body:scheme body params)) + (result + (org-babel-scheme-execute-with-geiser + full-body ; code + (string= result-type "output") ; output? + impl ; implementation + (and (not (string= session "none")) session)))) ; session + (let ((table + (org-babel-reassemble-table + result + (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)