From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Kost Subject: [PATCH 2/7] emacs: Move code for evaluating to "guix-geiser.el". Date: Sat, 25 Jul 2015 11:49:52 +0300 Message-ID: <1437814197-6321-3-git-send-email-alezost@gmail.com> References: <1437814197-6321-1-git-send-email-alezost@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:53369) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZIvA8-0004Ql-AJ for guix-devel@gnu.org; Sat, 25 Jul 2015 04:50:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZIvA6-0004zM-OJ for guix-devel@gnu.org; Sat, 25 Jul 2015 04:50:32 -0400 Received: from mail-la0-x231.google.com ([2a00:1450:4010:c03::231]:35184) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZIvA5-0004yx-Uj for guix-devel@gnu.org; Sat, 25 Jul 2015 04:50:30 -0400 Received: by lahh5 with SMTP id h5so25654224lah.2 for ; Sat, 25 Jul 2015 01:50:29 -0700 (PDT) In-Reply-To: <1437814197-6321-1-git-send-email-alezost@gmail.com> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: guix-devel@gnu.org Cc: Alex Kost * emacs/guix-backend.el: Adjust commentary. Move "eval" code to ... (guix-eval): Remove. (guix-eval-read, guix-eval-in-repl): Adjust to use new functions. * emacs/guix-geiser.el: ...here. New file. (guix-geiser-eval, guix-geiser-eval-read, guix-geiser-eval-in-repl): New functions. --- emacs/guix-backend.el | 39 ++++++++---------------------- emacs/guix-geiser.el | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 29 deletions(-) create mode 100644 emacs/guix-geiser.el diff --git a/emacs/guix-backend.el b/emacs/guix-backend.el index 7e55bea..8ccfaa6 100644 --- a/emacs/guix-backend.el +++ b/emacs/guix-backend.el @@ -1,6 +1,6 @@ -;;; guix-backend.el --- Communication with Geiser +;;; guix-backend.el --- Making and using Guix REPL -;; Copyright © 2014 Alex Kost +;; Copyright © 2014, 2015 Alex Kost ;; This file is part of GNU Guix. @@ -19,9 +19,10 @@ ;;; Commentary: -;; This file provides the code for interacting with Guile using Geiser. +;; This file provides the code for interacting with Guile using Guix REPL +;; (Geiser REPL with some guix-specific additions). -;; By default (if `guix-use-guile-server' is non-nil) 2 Geiser REPLs are +;; By default (if `guix-use-guile-server' is non-nil) 2 Guix REPLs are ;; started. The main one (with "guile --listen" process) is used for ;; "interacting" with a user - for showing a progress of ;; installing/deleting Guix packages. The second (internal) REPL is @@ -53,6 +54,7 @@ (require 'geiser-mode) (require 'guix-emacs) +(require 'guix-geiser) (defvar guix-load-path (file-name-directory (or load-file-name @@ -315,28 +317,10 @@ additional internal REPL if it exists." (defvar guix-operation-buffer nil "Buffer from which the latest Guix operation was performed.") -(defun guix-eval (str &optional wrap) - "Evaluate guile expression STR. -If WRAP is non-nil, wrap STR into (begin ...) form. -Return a list of strings with result values of evaluation." - (with-current-buffer (guix-get-repl-buffer 'internal) - (let* ((wrapped (if wrap (geiser-debug--wrap-region str) str)) - (code `(:eval (:scm ,wrapped))) - (ret (geiser-eval--send/wait code))) - (if (geiser-eval--retort-error ret) - (error "Error in evaluating guile expression: %s" - (geiser-eval--retort-output ret)) - (cdr (assq 'result ret)))))) - (defun guix-eval-read (str &optional wrap) - "Evaluate guile expression STR. -For the meaning of WRAP, see `guix-eval'. -Return elisp expression of the first result value of evaluation." - ;; Parsing scheme code with elisp `read' is probably not the best idea. - (read (replace-regexp-in-string - "#f\\|#" "nil" - (replace-regexp-in-string - "#t" "t" (car (guix-eval str wrap)))))) + "Evaluate STR with guile expression using Guix REPL. +See `guix-geiser-eval-read' for details." + (guix-geiser-eval-read str wrap (guix-get-repl-buffer 'internal))) (defun guix-eval-in-repl (str &optional operation-buffer operation-type) "Switch to Guix REPL and evaluate STR with guile expression there. @@ -350,10 +334,7 @@ successful executing of the current operation, (setq guix-repl-operation-p t guix-repl-operation-type operation-type guix-operation-buffer operation-buffer) - (let ((repl (guix-get-repl-buffer))) - (with-current-buffer repl - (geiser-repl--send str)) - (geiser-repl--switch-to-buffer repl))) + (guix-geiser-eval-in-repl str (guix-get-repl-buffer))) (provide 'guix-backend) diff --git a/emacs/guix-geiser.el b/emacs/guix-geiser.el new file mode 100644 index 0000000..1f0cf72 --- /dev/null +++ b/emacs/guix-geiser.el @@ -0,0 +1,67 @@ +;;; guix-geiser.el --- Interacting with Geiser + +;; Copyright © 2015 Alex Kost + +;; This file is part of GNU Guix. + +;; GNU Guix 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 Guix 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 this program. If not, see . + +;;; Commentary: + +;; This file provides functions to evaluate guile code using Geiser. + +;;; Code: + +(require 'geiser-mode) + +(defun guix-geiser-repl () + "Return the current Geiser REPL." + (or geiser-repl--repl + (geiser-repl--repl/impl 'guile) + (error "Geiser REPL not found"))) + +(defun guix-geiser-eval (str &optional wrap repl) + "Evaluate STR with guile expression using Geiser REPL. +If REPL is nil, use the current Geiser REPL. +If WRAP is non-nil, wrap STR into (begin ...) form. +Return a list of strings with result values of evaluation." + (with-current-buffer (or repl (guix-geiser-repl)) + (let* ((wrapped (if wrap (geiser-debug--wrap-region str) str)) + (code `(:eval (:scm ,wrapped))) + (ret (geiser-eval--send/wait code))) + (if (geiser-eval--retort-error ret) + (error "Error in evaluating guile expression: %s" + (geiser-eval--retort-output ret)) + (cdr (assq 'result ret)))))) + +(defun guix-geiser-eval-read (str &optional wrap repl) + "Evaluate STR with guile expression using Geiser REPL. +For the meaning of WRAP, see `guix-geiser-eval'. +Return elisp expression of the first result value of evaluation." + ;; Parsing scheme code with elisp `read' is probably not the best idea. + (read (replace-regexp-in-string + "#f\\|#" "nil" + (replace-regexp-in-string + "#t" "t" (car (guix-geiser-eval str wrap repl)))))) + +(defun guix-geiser-eval-in-repl (str &optional repl) + "Switch to Geiser REPL and evaluate STR with guile expression there." + (if repl + (geiser-repl--switch-to-buffer repl) + (geiser--go-to-repl)) + (geiser-repl--send str)) + +(provide 'guix-geiser) + +;;; guix-geiser.el ends here -- 2.4.3