diff options
author | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2013-06-10 00:06:55 +0200 |
---|---|---|
committer | Jose Antonio Ortega Ruiz <jao@gnu.org> | 2013-06-10 00:06:55 +0200 |
commit | 7b1a1d046059eb2ce68ea02706a0e7494c39684f (patch) | |
tree | 8a72cf5b83d913cc29802ecc4d1083b5c8386423 /elisp | |
parent | bba166c3ccb136fa8321ad9acc9cfd48a5fed357 (diff) | |
download | geiser-guile-7b1a1d046059eb2ce68ea02706a0e7494c39684f.tar.gz geiser-guile-7b1a1d046059eb2ce68ea02706a0e7494c39684f.tar.bz2 |
racket: new ,geiser-load command in REPL
... and used also internally for C-c C-k, although it doesn't yet work
as well as i wanted when it comes to load modules. The reason is
probably in geiser/enter, where we don't record modification times per
submodule but per path, which is not correct in the presence of submodules.
Diffstat (limited to 'elisp')
-rw-r--r-- | elisp/geiser-racket.el | 68 | ||||
-rw-r--r-- | elisp/geiser-syntax.el | 3 |
2 files changed, 37 insertions, 34 deletions
diff --git a/elisp/geiser-racket.el b/elisp/geiser-racket.el index 0d32790..5cd93dc 100644 --- a/elisp/geiser-racket.el +++ b/elisp/geiser-racket.el @@ -113,13 +113,41 @@ using start-geiser, a procedure in the geiser/server module." ;;; Evaluation support: +(defconst geiser-racket--module-re + "^(module[+*]? +\\([^ ]+\\)\\W+\\([^ ]+\\)?") + +(defun geiser-racket--explicit-module () + (save-excursion + (ignore-errors + (while (not (zerop (geiser-syntax--nesting-level))) + (backward-up-list))) + (and (looking-at geiser-racket--module-re) + (let ((mod (match-string-no-properties 1)) + (lang (match-string-no-properties 2))) + (cons (geiser-syntax--form-from-string mod) + (geiser-syntax--form-from-string lang)))))) + (defun geiser-racket--language () + (or (cdr (geiser-racket--explicit-module)) + (save-excursion + (goto-char (point-min)) + (if (re-search-forward "^#lang +\\([^ ]+\\)" nil t) + (geiser-syntax--form-from-string (match-string-no-properties 1)))) + "#f")) + +(defun geiser-racket--implicit-module () (save-excursion (goto-char (point-min)) - (if (re-search-forward - "^\\(?:#lang\\|(module +[^ ]+?\\) +\\([^ ]+?\\|([^)]+)\\) *$" nil t) - (car (geiser-syntax--read-from-string (match-string-no-properties 1))) - "#f"))) + (when (re-search-forward "^#lang " nil t) + (buffer-file-name)))) + +(defun geiser-racket--find-module () + (let ((bf (geiser-racket--implicit-module)) + (sub (car (geiser-racket--explicit-module)))) + (cond ((and (not bf) (not sub)) nil) + ((and (not bf) sub) sub) + (sub `(submod (file ,bf) ,sub)) + (t bf)))) (defun geiser-racket--enter-command (module) (when (or (stringp module) (listp module)) @@ -136,40 +164,12 @@ using start-geiser, a procedure in the geiser/server module." (geiser-racket--language) (mapconcat 'identity (cdr args) " "))) ((load-file compile-file) - (format ",geiser-eval geiser/main racket (geiser:%s %s)" - proc (car args))) + (format ",geiser-load %S" (geiser-racket--find-module))) ((no-values) ",geiser-no-values") (t (format ",apply geiser:%s (%s)" proc (mapconcat 'identity args " "))))) -(defconst geiser-racket--module-re - "^(module[+*]? +\\([^ ]+\\)") - -(defun geiser-racket--explicit-module () - (save-excursion - (ignore-errors - (while (not (zerop (geiser-syntax--nesting-level))) - (backward-up-list))) - (and (looking-at geiser-racket--module-re) - (ignore-errors - (car (geiser-syntax--read-from-string - (match-string-no-properties 1))))))) - -(defun geiser-racket--implicit-module () - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^#lang " nil t) - (buffer-file-name)))) - -(defun geiser-racket--find-module () - (let ((bf (geiser-racket--implicit-module)) - (sub (geiser-racket--explicit-module))) - (cond ((and (not bf) (not sub)) :f) - ((and (not bf) sub) sub) - (sub `(submod (file ,bf) ,sub)) - (t bf)))) - (defun geiser-racket--get-module (&optional module) - (cond ((null module) (geiser-racket--find-module)) + (cond ((null module) (or (geiser-racket--find-module) :f)) ((symbolp module) module) ((and (stringp module) (file-name-absolute-p module)) module) ((stringp module) (make-symbol module)) diff --git a/elisp/geiser-syntax.el b/elisp/geiser-syntax.el index 42e265e..d790734 100644 --- a/elisp/geiser-syntax.el +++ b/elisp/geiser-syntax.el @@ -202,6 +202,9 @@ implementation-specific entries for font-lock-keywords.") (save-excursion (insert string)) (cons (ignore-errors (geiser-syntax--read)) (point)))))) +(defun geiser-syntax--form-from-string (s) + (car (geiser-syntax--read-from-string s))) + (defsubst geiser-syntax--form-after-point (&optional boundary) (let ((geiser-syntax--read/buffer-limit (and (numberp boundary) boundary))) (save-excursion (values (geiser-syntax--read) (point))))) |