Re: [O] [PATCH] Emacs Org Babel Scheme (Geiser) support

2013-08-07 Thread Bruno Félix Rezende Ribeiro
Em Tue, 6 Aug 2013 23:32:20 + (UTC)
Michael Gauland  escreveu:

> Thanks for such a well-written, well-documented, and most of all
> useful contribution!  Definitely a big improvement over my initial
> implementation.

Thank you --- you're welcome.  I'm also very grateful for your
contribution to Babel.

> I've applied the patch to my system, but I'm having trouble getting
> it to work--I'm not getting any results. For example, this block:
>
> #+BEGIN_SRC scheme
> (display "This is the output")
> "This is the value"
> #+END_SRC
>
> Returns nil, whether I'm asking for output or value.

Your example is yielding the intended results on my system.

> I'm running emacs 23.4.1 on Debian wheezy, with Geiser 3.0.

I'm running GNU Emacs 24.1 on my own GNU, with Geiser 0.4.  That is
the latest version of Geiser (May 2013)[fn:1], perhaps your problem
resides there[fn:2].

> Could you send me a copy of your ob-scheme.el to help me track this
> down?

Sure.  It is attached.

--
 ,= ,-_-. =.  Bruno Félix Rezende Ribeiro (oitofelix) [0x28D618AF]
((_/)o o(\_)) There is no system but GNU;
 `-'(. .)`-'  Linux-libre is just one of its kernels;
 \_/  All software should be free as in freedom;

* Footnotes

[fn:1] http://geiser.nongnu.org/

[fn:2] I wonder whether you have misspelled your Geiser version.
;;; ob-scheme.el --- org-babel functions for Scheme

;; Copyright (C) 2010-2013 Free Software Foundation, Inc.

;; Authors: Eric Schulte, Michael Gauland
;; Keywords: literate programming, reproducible research, scheme
;; 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:

;; Now working with SBCL for both session and external evaluation.
;;
;; This certainly isn't optimally robust, but it seems to be working
;; for the basic use cases.

;;; Requirements:

;; - a working scheme implementation
;;   (e.g. guile http://www.gnu.org/software/guile/guile.html)
;;
;; - for session based evaluation geiser is required, which is available from
;;   ELPA.

;;; Code:
(require 'ob)
(require 'geiser nil t)
(defvar geiser-repl--repl) ; Defined in geiser-repl.el
(defvar geiser-impl--implementation)   ; Defined in geiser-impl.el
(defvar geiser-default-implementation) ; Defined in geiser-impl.el
(defvar geiser-active-implementations) ; Defined in geiser-impl.el

(declare-function run-geiser "geiser-repl" (impl))
(declare-function geiser-mode "geiser-mode" ())
(declare-function geiser-eval-region "geiser-mode" (start end &optional and-go raw nomsg))
(declare-function geiser-repl-exit "geiser-repl" (&optional arg))

(defvar org-babel-default-header-args:scheme '()
  "Default header arguments for scheme code blocks.")

(defun org-babel-expand-body:scheme (body params)
  "Expand BODY according to PARAMS, return the expanded body."
  (let ((vars (mapcar #'cdr (org-babel-get-header params :var
(if (> (length vars) 0)
(concat "(let ("
(mapconcat
 (lambda (var) (format "%S" (print `(,(car var) ',(cdr var)
 vars "\n  ")
")\n" body ")")
  body)))


(defvar org-babel-scheme-repl-map (make-hash-table :test 'equal)
  "Map of scheme sessions to session names.")

(defun org-babel-scheme-cleanse-repl-map ()
  "Remove dead buffers from the REPL map."
  (maphash
   (lambda (x y)
 (when (not (buffer-name y))
   (remhash x org-babel-scheme-repl-map)))
   org-babel-scheme-repl-map))

(defun org-babel-scheme-get-session-buffer (session-name)
  "Look up the scheme buffer for a session; return nil if it doesn't exist."
  (org-babel-scheme-cleanse-repl-map) ; Prune dead sessions
  (gethash session-name org-babel-scheme-repl-map))

(defun org-babel-scheme-set-session-buffer (session-name buffer)
  "Record the scheme buffer used for a given session."
  (puthash session-name buffer org-babel-scheme-repl-map))

(defun org-babel-scheme-get-buffer-impl (buffer)
  "Returns the scheme implementation geiser associates with the buffer."
  (with-current-buffer (set-buffer buffer)
geiser-impl--implementation))

(defun org-babel-scheme-get-repl (impl name)
  "Switch to a scheme REPL, creating it if it doesn't exist:"
  (let ((buffer (org-babel-scheme-get-session-buffer name))
	(window-cfg (current-window-configuration)))
(or buffer
	(progn
	  (run-geiser impl)
	  (setq buffer (current-buffer))
	  (if

Re: [O] [PATCH] Emacs Org Babel Scheme (Geiser) support

2013-08-06 Thread Michael Gauland
Thanks for such a well-written, well-documented, and most of all useful
contribution!  Definitely a big improvement over my initial implementation.

I've applied the patch to my system, but I'm having trouble getting it to
work--I'm not getting any results. For example, this block:

#+BEGIN_SRC scheme 
(display "This is the output")
"This is the value"
#+END_SRC 

Returns nil, whether I'm asking for output or value. I'm running emacs
23.4.1 on Debian wheezy, with Geiser 3.0.

Could you send me a copy of your ob-scheme.el to help me track this down?

Kind Regards,
Mike