diff --git a/lisp/langs/org-babel-ruby.el b/lisp/langs/org-babel-ruby.el index 444414956..fad29d6cf 100644 --- a/lisp/langs/org-babel-ruby.el +++ b/lisp/langs/org-babel-ruby.el @@ -115,10 +115,14 @@ then create. Return the initialized session." "When evaluated by Ruby this returns the return value of the last statement.") (defvar org-babel-ruby-eoe-indicator ":org_babel_ruby_eoe" "Used to indicate that evaluation is has completed.") -(defun org-babel-ruby-last-value-writer (file-name) - "Return a ruby statement to write the last value out to -FILE-NAME." - (format "File.open('w', '%s'){|f| f < _}.write" file-name)) +(defvar org-babel-ruby-wrapper-method + " +def main() +%s +end +results = main() +File.open('%s', 'w'){ |f| f.write((results.class == String) ? results : results.inspect) } +") (defun org-babel-ruby-evaluate (buffer body &optional result-type) "Pass BODY to the Ruby process in BUFFER. If RESULT-TYPE equals @@ -128,22 +132,32 @@ last statement in BODY." (let ((full-body (mapconcat #'org-babel-chomp (list body org-babel-ruby-last-value-eval org-babel-ruby-eoe-indicator) "\n")) raw result) - (if (and (stringp buffer) (string= buffer "none")) + (if (not session) ;; external process evaluation - (let ((tmp-file (make-temp-file "ruby-functional-results"))) - () - ) - ;; comint session evaluation - (setq raw (org-babel-comint-with-output buffer org-babel-ruby-eoe-indicator t - (insert full-body) (comint-send-input nil t))) + (save-window-excursion + (with-temp-buffer + (case result-type + (output + (insert body) + ;; (message "buffer=%s" (buffer-string)) ;; debugging + (shell-command-on-region (point-min) (point-max) "ruby" 'replace) + (buffer-string)) + (value + (let ((tmp-file (make-temp-file "ruby-functional-results"))) + (insert (format org-babel-ruby-wrapper-method body tmp-file)) + ;; (message "buffer=%s" (buffer-string)) ;; debugging + (shell-command-on-region (point-min) (point-max) "ruby") + (with-temp-buffer (insert-file-contents tmp-file) (buffer-string))))))) + ;; comint session evaluation + (setq raw (org-babel-comint-with-output buffer org-babel-ruby-eoe-indicator t + (insert full-body) (comint-send-input nil t))) (setq results (cdr (member org-babel-ruby-eoe-indicator (reverse (mapcar #'org-babel-ruby-read-string - (mapcar #'org-babel-trim raw))))))) - (case result-type - (output (mapconcat #'identity (reverse (cdr results)) "\n")) - (value (car results)) - (t (reverse results))))) + (mapcar #'org-babel-trim raw)))))) + (case result-type + (output (mapconcat #'identity (reverse (cdr results)) "\n")) + (value (car results)))))) (defun org-babel-ruby-read-string (string) "Strip \\\"s from around ruby string" diff --git a/org-babel.org b/org-babel.org index ed6feebf9..d0763ecb3 100644 --- a/org-babel.org +++ b/org-babel.org @@ -497,7 +497,7 @@ tabel Another example is in the [[*operations%20in%20on%20tables][grades example]]. -** PROPOSED add =:none= session argument (for purely functional execution) [0/4] +** PROPOSED add =:none= session argument (for purely functional execution) [1/4] This would allow source blocks to be run in their own new process - These blocks could then also be run in the background (since we can @@ -519,15 +519,21 @@ Down-sides to sessions - can't run in background - litter emacs with session buffers -*** TODO ruby +*** DONE ruby #+srcname: ruby-task-no-session -#+begin_src ruby :session none +#+begin_src ruby :results replace value +puts :eric puts :schulte [1, 2, 3] #+end_src +#+resname: ruby-task-no-session +| 1 | 2 | 3 | + *** TODO R + + *** TODO python *** TODO sh ** PROPOSED Are we happy with current behaviour regarding vector/scalar output?