From 385746d69c7610ce377304cb1a15a1490e40e8c2 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Fri, 8 Aug 2014 07:56:20 -0400 Subject: [PATCH] add support for forth code blocks Currently only session code block evaluation is supported, however this is a reasonable default for forth. * lisp/org.el (org-babel-load-languages): Add "Forth" to the list of loadable languages. * list/ob-forth.el: New file. --- lisp/ob-forth.el | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lisp/org.el | 1 + 2 files changed, 75 insertions(+) create mode 100644 lisp/ob-forth.el diff --git a/lisp/ob-forth.el b/lisp/ob-forth.el new file mode 100644 index 000000000..c64d46681 --- /dev/null +++ b/lisp/ob-forth.el @@ -0,0 +1,74 @@ +;;; ob-forth.el --- org-babel functions for Forth + +;; Copyright (C) 2014 Free Software Foundation, Inc. + +;; Author: Eric Schulte +;; Keywords: literate programming, reproducible research, forth +;; Homepage: http://orgmode.org + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: + +;; Requires the gforth forth compiler and `forth-mode' (see below). +;; https://www.gnu.org/software/gforth/ + +;;; Requirements: + +;; Session evaluation requires the gforth forth compiler as well as +;; `forth-mode' which is distributed with gforth (in gforth.el). + +;;; Code: +(require 'ob) + +(defvar org-babel-default-header-args:forth '((:session . "yes")) + "Default header arguments for forth code blocks.") + +(defun org-babel-execute:forth (body params) + "Execute a block of Forth code with org-babel. +This function is called by `org-babel-execute-src-block'" + (if (string= "none" (cdr (assoc :session params))) + (error "Non-session evaluation not supported for Forth code blocks") + (let ((all-results (org-babel-forth-session-execute body params))) + (if (member "output" (cdr (assoc :result-params params))) + (mapconcat #'identity all-results "\n") + (car (last all-results)))))) + +(defun org-babel-forth-session-execute (body params) + (require 'forth-mode) + (let ((proc (forth-proc)) + (forth-rx (concat " " (regexp-opt (list "ok" "compiled")) "\n")) + (result-start)) + (with-current-buffer (process-buffer (forth-proc)) + (mapcar (lambda (line) + (setq result-start (progn (goto-char (process-mark proc)) + (point))) + (comint-send-string proc (concat line "\n")) + ;; wait for forth to say "ok" + (while (not (progn (goto-char result-start) + (re-search-forward forth-rx nil t))) + (accept-process-output proc 0.01)) + (unless (string= "compiled" (match-string 1)) + (buffer-substring (+ result-start 1 (length line)) + (match-beginning 0)))) + (split-string (org-babel-trim + (org-babel-expand-body:generic + body params)) + "\n" 'omit-nulls))))) + +(provide 'ob-forth) + +;;; ob-forth.el ends here diff --git a/lisp/org.el b/lisp/org.el index 8eed2cc90..9b25204ce 100755 --- a/lisp/org.el +++ b/lisp/org.el @@ -268,6 +268,7 @@ requirements) is loaded." (const :tag "Ditaa" ditaa) (const :tag "Dot" dot) (const :tag "Emacs Lisp" emacs-lisp) + (const :tag "Forth" forth) (const :tag "Fortran" fortran) (const :tag "Gnuplot" gnuplot) (const :tag "Haskell" haskell) -- 2.11.4.GIT