]> gitweb.factorcode.org Git - factor.git/commitdiff
FUEL: Internal refactorings and cleanups.
authorJose A. Ortega Ruiz <jao@gnu.org>
Sun, 14 Dec 2008 15:50:34 +0000 (16:50 +0100)
committerJose A. Ortega Ruiz <jao@gnu.org>
Sun, 14 Dec 2008 15:50:34 +0000 (16:50 +0100)
misc/fuel/fuel-connection.el
misc/fuel/fuel-debug.el
misc/fuel/fuel-eval.el
misc/fuel/fuel-help.el
misc/fuel/fuel-log.el [new file with mode: 0644]
misc/fuel/fuel-mode.el
misc/fuel/fuel-syntax.el

index b72e6843bff8bcfb832b103769a6bb6e1824c0bf..168501171e3ccc8d247b220601a1a2067058f212 100644 (file)
@@ -14,6 +14,9 @@
 
 ;;; Code:
 
+(require 'fuel-base)
+(require 'fuel-log)
+
 \f
 ;;; Default connection:
 
   (add-hook 'comint-redirect-hook
             'fuel-con--comint-redirect-hook))
 
-\f
-;;; Logging:
-
-(defvar fuel-con--log-size 32000
-  "Maximum size of the Factor messages log.")
-
-(defvar fuel-con--log-verbose-p t
-  "Log level for Factor messages.")
-
-(define-derived-mode factor-messages-mode fundamental-mode "Factor Messages"
-  "Simple mode to log interactions with the factor listener"
-  (kill-all-local-variables)
-  (buffer-disable-undo)
-  (set (make-local-variable 'comint-redirect-subvert-readonly) t)
-  (add-hook 'after-change-functions
-            '(lambda (b e len)
-               (let ((inhibit-read-only t))
-                 (when (> b fuel-con--log-size)
-                   (delete-region (point-min) b))))
-            nil t)
-  (setq buffer-read-only t))
-
-(defun fuel-con--log-buffer ()
-  (or (get-buffer "*factor messages*")
-      (save-current-buffer
-        (set-buffer (get-buffer-create "*factor messages*"))
-        (factor-messages-mode)
-        (current-buffer))))
-
-(defun fuel-con--log-msg (type &rest args)
-  (with-current-buffer (fuel-con--log-buffer)
-    (let ((inhibit-read-only t))
-      (insert (format "\n%s: %s\n" type (apply 'format args))))))
-
-(defsubst fuel-con--log-warn (&rest args)
-  (apply 'fuel-con--log-msg 'WARNING args))
-
-(defsubst fuel-con--log-error (&rest args)
-  (apply 'fuel-con--log-msg 'ERROR args))
-
-(defsubst fuel-con--log-info (&rest args)
-  (if fuel-con--log-verbose-p (apply 'fuel-con--log-msg 'INFO args) ""))
-
 \f
 ;;; Requests handling:
 
            (str (and req (fuel-con--request-string req))))
       (when (and buffer req str)
         (set-buffer buffer)
-        (when fuel-con--log-verbose-p
-          (with-current-buffer (fuel-con--log-buffer)
+        (when fuel-log--verbose-p
+          (with-current-buffer (fuel-log--buffer)
             (let ((inhibit-read-only t))
-              (fuel-con--log-info "<%s>: %s" (fuel-con--request-id req) str))))
-        (comint-redirect-send-command str (fuel-con--log-buffer) nil t)))))
+              (fuel-log--info "<%s>: %s" (fuel-con--request-id req) str))))
+        (comint-redirect-send-command str (fuel-log--buffer) nil t)))))
 
 (defun fuel-con--process-completed-request (req)
   (let ((str (fuel-con--request-output req))
         (rstr (fuel-con--request-string req))
         (buffer (fuel-con--request-buffer req)))
     (if (not cont)
-        (fuel-con--log-warn "<%s> Droping result for request %S (%s)"
+        (fuel-log--warn "<%s> Droping result for request %S (%s)"
                             id rstr str)
       (condition-case cerr
           (with-current-buffer (or buffer (current-buffer))
             (funcall cont str)
-            (fuel-con--log-info "<%s>: processed\n\t%s" id str))
-        (error (fuel-con--log-error "<%s>: continuation failed %S \n\t%s"
+            (fuel-log--info "<%s>: processed\n\t%s" id str))
+        (error (fuel-log--error "<%s>: continuation failed %S \n\t%s"
                                     id rstr cerr))))))
 
 (defun fuel-con--comint-redirect-filter (str)
   (if (not fuel-con--connection)
-      (fuel-con--log-error "No connection in buffer (%s)" str)
+      (fuel-log--error "No connection in buffer (%s)" str)
     (let ((req (fuel-con--connection-current-request fuel-con--connection)))
-      (if (not req) (fuel-con--log-error "No current request (%s)" str)
+      (if (not req) (fuel-log--error "No current request (%s)" str)
         (fuel-con--request-output req str)
-        (fuel-con--log-info "<%s>: in progress" (fuel-con--request-id req)))))
-  ".\n")
+        (fuel-log--info "<%s>: in progress" (fuel-con--request-id req)))))
+  ".")
 
 (defun fuel-con--comint-redirect-hook ()
   (if (not fuel-con--connection)
-      (fuel-con--log-error "No connection in buffer")
+      (fuel-log--error "No connection in buffer")
     (let ((req (fuel-con--connection-current-request fuel-con--connection)))
-      (if (not req) (fuel-con--log-error "No current request (%s)" str)
+      (if (not req) (fuel-log--error "No current request (%s)" str)
         (fuel-con--process-completed-request req)
         (fuel-con--connection-clean-current-request fuel-con--connection)))))
 
index a7c06e4b3e92485a8d606a1a818b1045f1c1a16a..d34b31903e89a796739448ad146349eda225f9d9 100644 (file)
              (buffer (if file (find-file-noselect file) (current-buffer))))
         (with-current-buffer buffer
           (fuel-debug--display-retort
-           (fuel-eval--send/wait (fuel-eval--cmd/string (format ":%s" n)))
+           (fuel-eval--send/wait `(:fuel ((:factor ,(format ":%s" n)))))
            (format "Restart %s (%s) successful" n (nth (1- n) rs))))))))
 
 (defun fuel-debug-show--compiler-info (info)
       (error "%s information not available" info))
     (message "Retrieving %s info ..." info)
     (unless (fuel-debug--display-retort
-             (fuel-eval--send/wait (fuel-eval--cmd/string info))
+             (fuel-eval--send/wait `(:fuel ((:factor ,info))))
              "" (fuel-debug--buffer-file))
       (error "Sorry, no %s info available" info))))
 
index 02bcb54d66f09c169fd4b1b6b8474a783a37ac75..07c2ca3445c09158beba0f3d8d671db34164f59a 100644 (file)
 (require 'fuel-syntax)
 (require 'fuel-connection)
 
+\f
+;;; Simple sexp-based representation of factor code
+
+(defun factor (sexp)
+  (cond ((null sexp) "f")
+        ((eq sexp t) "t")
+        ((or (stringp sexp) (numberp sexp)) (format "%S" sexp))
+        ((vectorp sexp) (cons :quotation (append sexp nil)))
+        ((listp sexp)
+         (case (car sexp)
+           (:array (factor--seq 'V{ '} (cdr sexp)))
+           (:quote (format "\\ %s" (factor `(:factor ,(cadr sexp)))))
+           (:quotation (factor--seq '\[ '\] (cdr sexp)))
+           (:factor (format "%s" (mapconcat 'identity (cdr sexp) " ")))
+           (:fuel (factor--fuel-factor (cons :rs (cdr sexp))))
+           (:fuel* (factor--fuel-factor (cons :nrs (cdr sexp))))
+           (t (mapconcat 'factor sexp " "))))
+        ((keywordp sexp)
+         (factor (case sexp
+                   (:rs 'fuel-eval-restartable)
+                   (:nrs 'fuel-eval-non-restartable)
+                   (:in (fuel-syntax--current-vocab))
+                   (:usings `(:array ,@(fuel-syntax--usings-update)))
+                   (:get 'fuel-eval-set-result)
+                   (t `(:factor ,(symbol-name sexp))))))
+        ((symbolp sexp) (symbol-name sexp))))
+
+(defsubst factor--seq (begin end forms)
+  (format "%s %s %s" begin (if forms (factor forms) "") end))
+
+(defsubst factor--fuel-factor (sexp)
+  (factor `(,(factor--fuel-restart (nth 0 sexp))
+            ,(factor--fuel-lines (nth 1 sexp))
+            ,(factor--fuel-in (nth 2 sexp))
+            ,(factor--fuel-usings (nth 3 sexp))
+            fuel-eval-in-context)))
+
+(defsubst factor--fuel-restart (rs)
+  (unless (member rs '(:rs :nrs))
+    (error "Invalid restart spec (%s)" rs))
+  rs)
+
+(defsubst factor--fuel-lines (lst)
+  (cons :array (mapcar 'factor lst)))
+
+(defsubst factor--fuel-in (in)
+  (cond ((null in) :in)
+        ((eq in t) "fuel-scratchpad")
+        ((stringp in) in)
+        (t (error "Invalid 'in' (%s)" in))))
+
+(defsubst factor--fuel-usings (usings)
+  (cond ((null usings) :usings)
+        ((eq usings t) nil)
+        ((listp usings) `(:array ,@usings))
+        (t (error "Invalid 'usings' (%s)" usings))))
+
+
+\f
+;;; Code sending:
+
+(defvar fuel-eval--default-proc-function nil)
+(defsubst fuel-eval--default-proc ()
+  (and fuel-eval--default-proc-function
+       (funcall fuel-eval--default-proc-function)))
+
+(defvar fuel-eval--proc nil)
+
+(defvar fuel-eval--sync-retort nil)
+
+(defun fuel-eval--send/wait (code &optional timeout buffer)
+  (setq fuel-eval--sync-retort nil)
+  (fuel-con--send-string/wait (or fuel-eval--proc (fuel-eval--default-proc))
+                              (if (stringp code) code (factor code))
+                              '(lambda (s)
+                                 (setq fuel-eval--sync-retort
+                                       (fuel-eval--parse-retort s)))
+                              timeout
+                              buffer)
+  fuel-eval--sync-retort)
+
+(defun fuel-eval--send (code cont &optional buffer)
+  (fuel-con--send-string (or fuel-eval--proc (fuel-eval--default-proc))
+                         (if (stringp code) code (factor code))
+                         `(lambda (s) (,cont (fuel-eval--parse-retort s)))
+                         buffer))
+
 \f
 ;;; Retort and retort-error datatypes:
 
 (defsubst fuel-eval--error-line-text (err)
   (nth 3 (fuel-eval--error-lexer-p err)))
 
-\f
-;;; String sending::
-
-(defvar fuel-eval-log-max-length 16000)
-
-(defvar fuel-eval--default-proc-function nil)
-(defsubst fuel-eval--default-proc ()
-  (and fuel-eval--default-proc-function
-       (funcall fuel-eval--default-proc-function)))
-
-(defvar fuel-eval--proc nil)
-
-(defvar fuel-eval--log t)
-
-(defvar fuel-eval--sync-retort nil)
-
-(defun fuel-eval--send/wait (str &optional timeout buffer)
-  (setq fuel-eval--sync-retort nil)
-  (fuel-con--send-string/wait (or fuel-eval--proc (fuel-eval--default-proc))
-                              str
-                              '(lambda (s)
-                                 (setq fuel-eval--sync-retort
-                                       (fuel-eval--parse-retort s)))
-                              timeout
-                              buffer)
-  fuel-eval--sync-retort)
-
-(defun fuel-eval--send (str cont &optional buffer)
-  (fuel-con--send-string (or fuel-eval--proc (fuel-eval--default-proc))
-                         str
-                         `(lambda (s) (,cont (fuel-eval--parse-retort s)))
-                         buffer))
-
-\f
-;;; Evaluation protocol
-
-(defsubst fuel-eval--factor-array (strs)
-  (format "V{ %S }" (mapconcat 'identity strs " ")))
-
-(defun fuel-eval--cmd/lines (strs &optional no-rs in usings)
-  (unless (and in usings) (fuel-syntax--usings-update))
-  (let* ((in (cond ((not in) (or fuel-syntax--current-vocab "f"))
-                   ((eq in t) "fuel-scratchpad")
-                   (in in)))
-         (usings (cond ((not usings) fuel-syntax--usings)
-                       ((eq usings t) nil)
-                       (usings usings))))
-    (format "fuel-eval-%srestartable %s %S %s fuel-eval-in-context"
-            (if no-rs "non-" "")
-            (fuel-eval--factor-array strs)
-            in
-            (fuel-eval--factor-array usings))))
-
-(defsubst fuel-eval--cmd/string (str &optional no-rs in usings)
-  (fuel-eval--cmd/lines (list str) no-rs in usings))
-
-(defun fuel-eval--cmd/region (begin end &optional no-rs in usings)
-  (let ((lines (split-string (buffer-substring-no-properties begin end)
-                             "[\f\n\r\v]+" t)))
-    (when (> (length lines) 0)
-      (fuel-eval--cmd/lines lines no-rs in usings))))
-
-
 \f
 (provide 'fuel-eval)
 ;;; fuel-eval.el ends here
index 1d39d1571dc95bcd3d10bc61a4ad6f996da48e25..d4bf757cd721ef93d6abd9816d03d3729633849a 100644 (file)
@@ -75,8 +75,7 @@
   (let ((word (or word (fuel-syntax-symbol-at-point)))
         (fuel-eval--log t))
     (when word
-      (let* ((str (format "\\ %s synopsis fuel-eval-set-result" word))
-             (cmd (fuel-eval--cmd/string str t t))
+      (let* ((cmd `(:fuel* (((:quote ,word) synopsis :get)) t))
              (ret (fuel-eval--send/wait cmd 20)))
         (when (and ret (not (fuel-eval--retort-error ret)))
           (if fuel-help-minibuffer-font-lock
@@ -151,10 +150,9 @@ displayed in the minibuffer."
                   fuel-help-always-ask))
          (def (if ask (read-string prompt nil 'fuel-help--prompt-history def)
                 def))
-         (cmd (format "\\ %s %s" def (if see "see" "help"))))
+         (cmd `(:fuel* ((:quote ,def) ,(if see 'see 'help)) t)))
     (message "Looking up '%s' ..." def)
-    (fuel-eval--send (fuel-eval--cmd/string cmd t t)
-                     `(lambda (r) (fuel-help--show-help-cont ,def r)))))
+    (fuel-eval--send cmd `(lambda (r) (fuel-help--show-help-cont ,def r)))))
 
 (defun fuel-help--show-help-cont (def ret)
   (let ((out (fuel-eval--retort-output ret)))
diff --git a/misc/fuel/fuel-log.el b/misc/fuel/fuel-log.el
new file mode 100644 (file)
index 0000000..ba048a6
--- /dev/null
@@ -0,0 +1,72 @@
+;;; fuel-log.el -- logging utilities
+
+;; Copyright (C) 2008 Jose Antonio Ortega Ruiz
+;; See http://factorcode.org/license.txt for BSD license.
+
+;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
+;; Keywords: languages, fuel, factor
+;; Start date: Sun Dec 14, 2008 01:00
+
+;;; Comentary:
+
+;; Some utilities for maintaining a simple log buffer, mainly for
+;; debugging purposes.
+
+;;; Code:
+
+(require 'fuel-base)
+
+\f
+;;; Customization:
+
+(defvar fuel-log--buffer-name "*fuel messages*"
+  "Name of the log buffer")
+
+(defvar fuel-log--max-buffer-size 32000
+  "Maximum size of the Factor messages log")
+
+(defvar fuel-log--max-message-size 512
+  "Maximum size of individual log messages")
+
+(defvar fuel-log--verbose-p t
+  "Log level for Factor messages")
+
+(define-derived-mode factor-messages-mode fundamental-mode "FUEL Messages"
+  "Simple mode to log interactions with the factor listener"
+  (kill-all-local-variables)
+  (buffer-disable-undo)
+  (set (make-local-variable 'comint-redirect-subvert-readonly) t)
+  (add-hook 'after-change-functions
+            '(lambda (b e len)
+               (let ((inhibit-read-only t))
+                 (when (> b fuel-log--max-buffer-size)
+                   (delete-region (point-min) b))))
+            nil t)
+  (setq buffer-read-only t))
+
+(defun fuel-log--buffer ()
+  (or (get-buffer fuel-log--buffer-name)
+      (save-current-buffer
+        (set-buffer (get-buffer-create fuel-log--buffer-name))
+        (factor-messages-mode)
+        (current-buffer))))
+
+(defun fuel-log--msg (type &rest args)
+  (with-current-buffer (fuel-log--buffer)
+    (let ((inhibit-read-only t))
+      (insert
+       (fuel--shorten-str (format "\n%s: %s\n" type (apply 'format args))
+                          fuel-log--max-message-size)))))
+
+(defsubst fuel-log--warn (&rest args)
+  (apply 'fuel-log--msg 'WARNING args))
+
+(defsubst fuel-log--error (&rest args)
+  (apply 'fuel-log--msg 'ERROR args))
+
+(defsubst fuel-log--info (&rest args)
+  (if fuel-log--verbose-p (apply 'fuel-log--msg 'INFO args) ""))
+
+\f
+(provide 'fuel-log)
+;;; fuel-log.el ends here
index fbfe614526c798ac2a3a360230c672d8102dda62..2dc15ce272ce2e7757316640518d9b061ae636a7 100644 (file)
@@ -49,7 +49,7 @@ With prefix argument, ask for the file to run."
     (when buffer
       (with-current-buffer buffer
         (message "Compiling %s ..." file)
-        (fuel-eval--send (fuel-eval--cmd/string (format "%S fuel-run-file" file))
+        (fuel-eval--send `(:fuel (,file fuel-run-file))
                          `(lambda (r) (fuel--run-file-cont r ,file)))))))
 
 (defun fuel--run-file-cont (ret file)
@@ -65,15 +65,18 @@ With prefix argument, ask for the file to run."
 Unless called with a prefix, switchs to the compilation results
 buffer in case of errors."
   (interactive "r\nP")
-  (fuel-debug--display-retort
-   (fuel-eval--send/wait (fuel-eval--cmd/region begin end) 10000)
-   (format "%s%s"
-           (if fuel-syntax--current-vocab
-               (format "IN: %s " fuel-syntax--current-vocab)
-             "")
-           (fuel--shorten-region begin end 70))
-   arg
-   (buffer-file-name)))
+  (let* ((lines (split-string (buffer-substring-no-properties begin end)
+                              "[\f\n\r\v]+" t))
+         (cmd `(:fuel (,(mapcar (lambda (l) `(:factor ,l)) lines)))))
+    (fuel-debug--display-retort
+     (fuel-eval--send/wait cmd 10000)
+     (format "%s%s"
+             (if fuel-syntax--current-vocab
+                 (format "IN: %s " fuel-syntax--current-vocab)
+               "")
+             (fuel--shorten-region begin end 70))
+     arg
+     (buffer-file-name))))
 
 (defun fuel-eval-extended-region (begin end &optional arg)
   "Sends region extended outwards to nearest definitions,
@@ -119,17 +122,16 @@ With prefix, asks for the word to edit."
                                         (if word (format " (%s)" word) ""))
                                 word)
                  word)))
-    (let ((str (fuel-eval--cmd/string
-                (format "\\ %s fuel-get-edit-location" word))))
+    (let ((cmd `(:fuel ((:quote ,word) fuel-get-edit-location))))
       (condition-case nil
-          (fuel--try-edit (fuel-eval--send/wait str))
+          (fuel--try-edit (fuel-eval--send/wait cmd))
         (error (fuel-edit-vocabulary word))))))
 
 (defvar fuel--vocabs-prompt-history nil)
 
 (defun fuel--read-vocabulary-name ()
-  (let* ((str (fuel-eval--cmd/string "fuel-get-vocabs" t "fuel" t))
-         (vocabs (fuel-eval--retort-result (fuel-eval--send/wait str)))
+  (let* ((cmd '(:fuel* (fuel-get-vocabs) "fuel" t))
+         (vocabs (fuel-eval--retort-result (fuel-eval--send/wait cmd)))
          (prompt "Vocabulary name: "))
     (if vocabs
         (completing-read prompt vocabs nil t nil fuel--vocabs-prompt-history)
@@ -139,9 +141,8 @@ With prefix, asks for the word to edit."
   "Visits vocabulary file in Emacs.
 When called interactively, asks for vocabulary with completion."
   (interactive (list (fuel--read-vocabulary-name)))
-  (let* ((str (fuel-eval--cmd/string
-               (format "%S fuel-get-vocab-location" vocab) t "fuel" t)))
-    (fuel--try-edit (fuel-eval--send/wait str))))
+  (let* ((cmd `(:fuel* (,vocab fuel-get-vocab-location) "fuel" t)))
+    (fuel--try-edit (fuel-eval--send/wait cmd))))
 
 \f
 ;;; Minor mode definition:
index e9de3a64fad376a5a0d22fa7ff2b1b2bd90e0915..ff8126c507ecfdde57efc37ee5d922f378a971e3 100644 (file)
 
 (defun fuel-syntax--usings-update ()
   (save-excursion
-    (setq fuel-syntax--usings (list (fuel-syntax--current-vocab)))
+    (let ((in (fuel-syntax--current-vocab)))
+      (setq fuel-syntax--usings (and in (list in))))
     (while (re-search-backward fuel-syntax--using-lines-regex nil t)
       (dolist (u (split-string (match-string-no-properties 1) nil t))
         (push u fuel-syntax--usings)))