ruby can now be run with NO session

This commit is contained in:
Eric Schulte 2009-06-15 10:13:48 -07:00
parent ce1726713a
commit 00365e1fbe
2 changed files with 39 additions and 19 deletions

View File

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

View File

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