]> gitweb.factorcode.org Git - factor.git/blobdiff - misc/fuel/fuel-eval.el
FUEL: refactoring to eliminate the eval-result variable
[factor.git] / misc / fuel / fuel-eval.el
index 149e608964fa50b701cdce48a1f91ef4208317dd..374c5a56f97ad506273751a89c3d9c3dd7f75828 100644 (file)
 
 ;;; Code:
 
-(require 'fuel-syntax)
 (require 'fuel-connection)
 (require 'fuel-log)
 (require 'fuel-base)
+(require 'factor-mode)
 
-(eval-when-compile (require 'cl))
+(require 'cl-lib)
 
 \f
 ;;; Simple sexp-based representation of factor code
         ((or (stringp sexp) (numberp sexp)) (format "%S" sexp))
         ((vectorp sexp) (factor (cons :quotation (append sexp nil))))
         ((listp sexp)
-         (case (car sexp)
+         (cl-case (car sexp)
            (:array (factor--seq 'V{ '} (cdr sexp)))
+           (:seq (factor--seq '{ '} (cdr sexp)))
+           (:tuple (factor--seq 'T{ '} (cdr sexp)))
            (:quote (format "\\ %s" (factor `(:factor ,(cadr sexp)))))
            (:quotation (factor--seq '\[ '\] (cdr sexp)))
            (:using (factor `(USING: ,@(cdr sexp) :end)))
            (:fuel* (factor--fuel-factor (cons :nrs (cdr sexp))))
            (t (mapconcat 'factor sexp " "))))
         ((keywordp sexp)
-         (factor (case sexp
+         (factor (cl-case sexp
                    (:rs 'fuel-eval-restartable)
                    (:nrs 'fuel-eval-non-restartable)
-                   (:in (fuel-syntax--current-vocab))
-                   (:usings `(:array ,@(fuel-syntax--usings)))
-                   (:get 'fuel-eval-set-result)
+                   (:in (or (factor-current-vocab) "fuel"))
+                   (:usings `(:array ,@(factor-usings)))
                    (:end '\;)
                    (t `(:factor ,(symbol-name sexp))))))
         ((symbolp sexp) (symbol-name sexp))))
 (defsubst factor--fuel-in (in)
   (cond ((or (eq in :in) (null in)) :in)
         ((eq in 'f) 'f)
-        ((eq in 't) "fuel-scratchpad")
+        ((eq in 't) "fuel")
         ((stringp in) in)
         (t (error "Invalid 'in' (%s)" in))))
 
 (defsubst factor--fuel-usings (usings)
-  (cond ((null usings) :usings)
+  (cond ((or (null usings) (eq usings :usings)) :usings)
         ((eq usings t) nil)
         ((listp usings) `(:array ,@usings))
         (t (error "Invalid 'usings' (%s)" usings))))
@@ -96,7 +97,7 @@
   (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)
+                              #'(lambda (s)
                                  (setq fuel-eval--sync-retort
                                        (fuel-eval--parse-retort s)))
                               timeout
 (defsubst fuel-eval--retort-result (ret) (nth 1 ret))
 (defsubst fuel-eval--retort-output (ret) (nth 2 ret))
 
+(defun fuel-eval--retort-result-safe (ret)
+  "Retort result or throws an error if the retort error is set."
+  (let ((err (fuel-eval--retort-error ret)))
+    (when err (error "%s" err))
+    (fuel-eval--retort-result ret)))
+
 (defsubst fuel-eval--retort-p (ret)
   (and (listp ret) (= 3 (length ret))))
 
-(defsubst fuel-eval--make-parse-error-retort (str)
-  (fuel-eval--retort-make (cons 'fuel-parse-retort-error str) nil))
-
 (defun fuel-eval--parse-retort (ret)
   (fuel-log--info "RETORT: %S" ret)
-  (if (fuel-eval--retort-p ret) ret
-    (fuel-eval--make-parse-error-retort ret)))
+  (if (fuel-eval--retort-p ret)
+      ret
+    (list ret nil nil)))
 
 (defsubst fuel-eval--error-name (err) (car err))
 
         (assoc name err))))
 
 (defsubst fuel-eval--error-restarts (err)
-  (cdr (assoc :restarts (or (fuel-eval--error-name-p err 'condition)
-                            (fuel-eval--error-name-p err 'lexer-error)))))
+  (alist-get :restarts (or (fuel-eval--error-name-p err 'condition)
+                           (fuel-eval--error-name-p err 'lexer-error))))
 
 (defsubst fuel-eval--error-file (err)
   (nth 1 (fuel-eval--error-name-p err 'source-file-error)))