123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- (require 'ob)
- (add-to-list 'org-babel-tangle-lang-exts '("perl" . "pl"))
- (defvar org-babel-default-header-args:perl '())
- (defun org-babel-expand-body:perl (body params &optional processed-params)
- "Expand BODY according to PARAMS, return the expanded body."
- (let ((vars (nth 1 (or processed-params (org-babel-process-params params)))))
- (concat
- (mapconcat
- (lambda (pair)
- (format "$%s=%s;"
- (car pair)
- (org-babel-perl-var-to-perl (cdr pair))))
- vars "\n") "\n" (org-babel-trim body) "\n")))
- (defun org-babel-execute:perl (body params)
- "Execute a block of Perl code with org-babel. This function is
- called by `org-babel-execute-src-block'."
- (message "executing Perl source code block")
- (let* ((processed-params (org-babel-process-params params))
- (session (first processed-params))
- (vars (nth 1 processed-params))
- (result-params (nth 2 processed-params))
- (result-type (nth 3 processed-params))
- (full-body (org-babel-expand-body:perl
- body params processed-params))
- (session (org-babel-perl-initiate-session session)))
- (org-babel-reassemble-table
- (org-babel-perl-evaluate session full-body result-type)
- (org-babel-pick-name (nth 4 processed-params) (cdr (assoc :colnames params)))
- (org-babel-pick-name (nth 5 processed-params) (cdr (assoc :rownames params))))))
- (defun org-babel-prep-session:perl (session params)
- "Prepare SESSION according to the header arguments specified in PARAMS."
- (error "Sessions are not supported for Perl."))
- (defun org-babel-perl-var-to-perl (var)
- "Convert an elisp var into a string of perl source code
- specifying a var of the same value."
- (if (listp var)
- (concat "[" (mapconcat #'org-babel-perl-var-to-perl var ", ") "]")
- (format "%S" var)))
- (defvar org-babel-perl-buffers '(:default . nil))
- (defun org-babel-perl-initiate-session (&optional session params)
- "Simply return nil, as sessions are not supported by perl"
- nil)
- (defvar org-babel-perl-wrapper-method
- "
- sub main {
- %s
- }
- @r = main;
- open(o, \">%s\");
- print o join(\"\\n\", @r), \"\\n\"")
- (defvar org-babel-perl-pp-wrapper-method
- nil)
- (defun org-babel-perl-evaluate (session body &optional result-type)
- "Pass BODY to the Perl process in SESSION. If RESULT-TYPE equals
- 'output then return a list of the outputs of the statements in
- BODY, if RESULT-TYPE equals 'value then return the value of the
- last statement in BODY, as elisp."
- (if (not session)
-
- (save-excursion
- (case result-type
- (output
- (with-temp-buffer
- (insert body)
-
- (org-babel-shell-command-on-region (point-min) (point-max) "perl" 'current-buffer 'replace)
- (buffer-string)))
- (value
- (let* ((tmp-file (make-temp-file "perl-functional-results")) exit-code
- (stderr
- (with-temp-buffer
- (insert
- (format
- (if (member "pp" result-params)
- (error "Pretty-printing not implemented for perl")
- org-babel-perl-wrapper-method) body tmp-file))
- (setq exit-code
- (org-babel-shell-command-on-region
- (point-min) (point-max) "perl" nil 'replace (current-buffer)))
- (buffer-string))))
- (if (> exit-code 0) (org-babel-error-notify exit-code stderr))
- (org-babel-import-elisp-from-file (org-babel-maybe-remote-file tmp-file))))))
-
- (error "Sessions are not supported for Perl.")))
- (provide 'ob-perl)
|