123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- (require 'ob)
- (require 'mozart)
- (defvar org-babel-oz-server-dir
- (file-name-as-directory
- (expand-file-name
- "contrib/scripts"
- (file-name-as-directory
- (expand-file-name
- "../../.."
- (file-name-directory (or load-file-name buffer-file-name))))))
- "Path to the contrib/scripts directory in which
- StartOzServer.oz is located.")
- (defvar org-babel-oz-port 6001
- "Port for communicating with Oz compiler.")
- (defvar org-babel-oz-OPI-socket nil
- "Socket for communicating with OPI.")
- (defvar org-babel-oz-collected-result nil
- "Aux var to hand result from org-babel-oz-filter to oz-send-string-expression.")
- (defun org-babel-oz-filter (proc string)
- "Processes output from socket org-babel-oz-OPI-socket."
- (setq org-babel-oz-collected-result string)
- )
- (defun org-babel-oz-create-socket ()
- (message "Create OPI socket for evaluating expressions")
-
- (run-oz)
-
- (oz-send-string (concat "\\insert '" org-babel-oz-server-dir "StartOzServer.oz'"))
-
-
-
-
-
- (sit-for 3)
-
- (setq org-babel-oz-OPI-socket
-
- (open-network-stream "*Org-babel-OPI-socket*" nil "localhost" org-babel-oz-port))
-
- (set-process-filter org-babel-oz-OPI-socket #'org-babel-oz-filter)
- )
- (defun oz-send-string-expression (string &optional wait-time)
- "Similar to oz-send-string, oz-send-string-expression sends a string to the OPI compiler. However, string must be expression and this function returns the result of the expression (as string). oz-send-string-expression is synchronous, wait-time allows to specify a maximum wait time. After wait-time is over with no result, the function returns nil."
- (if (not org-babel-oz-OPI-socket)
- (org-babel-oz-create-socket))
- (let ((polling-delay 0.1)
- result)
- (process-send-string org-babel-oz-OPI-socket string)
-
- (if wait-time
- (let ((waited 0))
- (unwind-protect
- (progn
- (while
-
- (not (or (not (equal org-babel-oz-collected-result nil))
- (> waited wait-time)))
- (progn
- (sit-for polling-delay)
- (setq waited (+ waited polling-delay))))
- (setq result org-babel-oz-collected-result)
- (setq org-babel-oz-collected-result nil))))
- (unwind-protect
- (progn
- (while (equal org-babel-oz-collected-result nil)
- (sit-for polling-delay))
- (setq result org-babel-oz-collected-result)
- (setq org-babel-oz-collected-result nil))))
- result))
- (defun org-babel-expand-body:oz (body params)
- (let ((vars (mapcar #'cdr (org-babel-get-header params :var))))
- (if vars
-
- (let ((var-string (mapcar (lambda (pair)
- (format "%s=%s"
- (car pair)
- (org-babel-oz-var-to-oz (cdr pair))))
- vars)))
-
- (mapconcat #'identity
- (append (list "local") var-string (list "in" body "end"))
- "\n"))
- body)))
- (defun org-babel-execute:oz (body params)
- "Execute a block of Oz code with org-babel. This function is
- called by `org-babel-execute-src-block' via multiple-value-bind."
- (let* ((result-params (cdr (assoc :result-params params)))
- (full-body (org-babel-expand-body:oz body params))
- (wait-time (plist-get params :wait-time)))
-
- (org-babel-reassemble-table
- (cond
- ((member "output" result-params)
- (message "Org-babel: executing Oz statement")
- (oz-send-string full-body))
- ((member "value" result-params)
- (message "Org-babel: executing Oz expression")
- (oz-send-string-expression full-body (or wait-time 1)))
- (t (error "either 'output' or 'results' must be members of :results.")))
- (org-babel-pick-name (cdr (assoc :colname-names params))
- (cdr (assoc :colnames params)))
- (org-babel-pick-name (cdr (assoc :roname-names params))
- (cdr (assoc :rownames params))))))
- (defun org-babel-prep-session:oz (session params)
- "Prepare SESSION according to the header arguments specified in PARAMS."
- (error "org-babel-prep-session:oz unimplemented"))
- (defun org-babel-oz-initiate-session (&optional session params)
- "If there is not a current inferior-process-buffer in SESSION
- then create. Return the initialized session."
- (unless (string= session "none")
-
- (save-window-excursion
-
- (get-buffer oz-compiler-buffer))))
- (defun org-babel-oz-var-to-oz (var)
- "Convert an elisp var into a string of Oz source code
- specifying a var of the same value."
- (if (listp var)
- (eval var)
- (format "%s" var)
- ))
- (defun org-babel-oz-table-or-string (results)
- "If the results look like a table, then convert them into an
- Emacs-lisp table, otherwise return the results as a string."
- (error "org-babel-oz-table-or-string unimplemented"))
- (provide 'ob-oz)
|