| 
									
										
										
										
											2008-12-12 19:54:18 -05:00
										 |  |  |  | ;;; fuel-eval.el --- evaluating Factor expressions | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-05 00:22:36 -05:00
										 |  |  |  | ;; Copyright (C) 2008, 2009  Jose Antonio Ortega Ruiz | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | ;; See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org> | 
					
						
							|  |  |  |  | ;; Keywords: languages | 
					
						
							|  |  |  |  | ;; Start date: Tue Dec 02, 2008 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | ;;; Commentary: | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-12 19:54:18 -05:00
										 |  |  |  | ;; Protocols for sending evaluations to the Factor listener. | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | ;;; Code: | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-12 19:54:18 -05:00
										 |  |  |  | (require 'fuel-connection) | 
					
						
							| 
									
										
										
										
											2009-01-05 00:22:36 -05:00
										 |  |  |  | (require 'fuel-log) | 
					
						
							|  |  |  |  | (require 'fuel-base) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:48:12 -04:00
										 |  |  |  | (require 'factor-mode) | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-05 00:48:12 -04:00
										 |  |  |  | (require 'cl-lib) | 
					
						
							| 
									
										
										
										
											2008-12-15 17:44:13 -05:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |  | 
					
						
							|  |  |  |  | ;;; 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)) | 
					
						
							| 
									
										
										
										
											2008-12-20 10:51:05 -05:00
										 |  |  |  |         ((vectorp sexp) (factor (cons :quotation (append sexp nil)))) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |         ((listp sexp) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:48:12 -04:00
										 |  |  |  |          (cl-case (car sexp) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |            (:array (factor--seq 'V{ '} (cdr sexp))) | 
					
						
							| 
									
										
										
										
											2009-01-15 18:38:18 -05:00
										 |  |  |  |            (:seq (factor--seq '{ '} (cdr sexp))) | 
					
						
							| 
									
										
										
										
											2009-01-25 05:42:35 -05:00
										 |  |  |  |            (:tuple (factor--seq 'T{ '} (cdr sexp))) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |            (:quote (format "\\ %s" (factor `(:factor ,(cadr sexp))))) | 
					
						
							|  |  |  |  |            (:quotation (factor--seq '\[ '\] (cdr sexp))) | 
					
						
							| 
									
										
										
										
											2008-12-20 10:51:05 -05:00
										 |  |  |  |            (:using (factor `(USING: ,@(cdr sexp) :end))) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |            (: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) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:48:12 -04:00
										 |  |  |  |          (factor (cl-case sexp | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |                    (:rs 'fuel-eval-restartable) | 
					
						
							|  |  |  |  |                    (:nrs 'fuel-eval-non-restartable) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:48:12 -04:00
										 |  |  |  |                    (:in (or (factor-current-vocab) "fuel")) | 
					
						
							|  |  |  |  |                    (:usings `(:array ,@(factor-usings))) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |                    (:get 'fuel-eval-set-result) | 
					
						
							| 
									
										
										
										
											2008-12-20 10:51:05 -05:00
										 |  |  |  |                    (:end '\;) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |                    (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) | 
					
						
							| 
									
										
										
										
											2008-12-27 09:18:17 -05:00
										 |  |  |  |   (cond ((or (eq in :in) (null in)) :in) | 
					
						
							| 
									
										
										
										
											2008-12-17 17:50:48 -05:00
										 |  |  |  |         ((eq in 'f) 'f) | 
					
						
							| 
									
										
										
										
											2009-01-11 08:15:26 -05:00
										 |  |  |  |         ((eq in 't) "fuel") | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |         ((stringp in) in) | 
					
						
							|  |  |  |  |         (t (error "Invalid 'in' (%s)" in)))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | (defsubst factor--fuel-usings (usings) | 
					
						
							| 
									
										
										
										
											2009-02-18 19:33:47 -05:00
										 |  |  |  |   (cond ((or (null usings) (eq usings :usings)) :usings) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |         ((eq usings t) nil) | 
					
						
							|  |  |  |  |         ((listp usings) `(:array ,@usings)) | 
					
						
							|  |  |  |  |         (t (error "Invalid 'usings' (%s)" usings)))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |  | 
					
						
							|  |  |  |  | ;;; 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)) | 
					
						
							| 
									
										
										
										
											2013-05-05 00:48:12 -04:00
										 |  |  |  |                               #'(lambda (s) | 
					
						
							| 
									
										
										
										
											2008-12-14 10:50:34 -05:00
										 |  |  |  |                                  (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)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  |  | 
					
						
							| 
									
										
										
										
											2008-12-12 19:54:18 -05:00
										 |  |  |  | ;;; Retort and retort-error datatypes: | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | (defsubst fuel-eval--retort-make (err result &optional output) | 
					
						
							|  |  |  |  |   (list err result output)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-25 05:42:35 -05:00
										 |  |  |  | (defsubst fuel-eval--retort-error (ret) (nth 0 ret)) | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | (defsubst fuel-eval--retort-result (ret) (nth 1 ret)) | 
					
						
							|  |  |  |  | (defsubst fuel-eval--retort-output (ret) (nth 2 ret)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-17 18:12:19 -04:00
										 |  |  |  | (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))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 15:44:41 -05:00
										 |  |  |  | (defsubst fuel-eval--retort-p (ret) | 
					
						
							|  |  |  |  |   (and (listp ret) (= 3 (length ret)))) | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-17 15:44:41 -05:00
										 |  |  |  | (defun fuel-eval--parse-retort (ret) | 
					
						
							| 
									
										
										
										
											2009-01-05 00:22:36 -05:00
										 |  |  |  |   (fuel-log--info "RETORT: %S" ret) | 
					
						
							| 
									
										
										
										
											2014-04-25 11:39:44 -04:00
										 |  |  |  |   (if (fuel-eval--retort-p ret) | 
					
						
							|  |  |  |  |       ret | 
					
						
							|  |  |  |  |     (list ret nil nil))) | 
					
						
							| 
									
										
										
										
											2008-12-08 20:36:55 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | (defsubst fuel-eval--error-name (err) (car err)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | (defun fuel-eval--error-name-p (err name) | 
					
						
							|  |  |  |  |   (unless (null err) | 
					
						
							|  |  |  |  |     (or (and (eq (fuel-eval--error-name err) name) err) | 
					
						
							|  |  |  |  |         (assoc name err)))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-23 16:37:25 -05:00
										 |  |  |  | (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))))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 20:36:55 -05:00
										 |  |  |  | (defsubst fuel-eval--error-file (err) | 
					
						
							|  |  |  |  |   (nth 1 (fuel-eval--error-name-p err 'source-file-error))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | (defsubst fuel-eval--error-lexer-p (err) | 
					
						
							|  |  |  |  |   (or (fuel-eval--error-name-p err 'lexer-error) | 
					
						
							|  |  |  |  |       (fuel-eval--error-name-p (fuel-eval--error-name-p err 'source-file-error) | 
					
						
							|  |  |  |  |                                'lexer-error))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | (defsubst fuel-eval--error-line/column (err) | 
					
						
							|  |  |  |  |   (let ((err (fuel-eval--error-lexer-p err))) | 
					
						
							|  |  |  |  |     (cons (nth 1 err) (nth 2 err)))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | (defsubst fuel-eval--error-line-text (err) | 
					
						
							|  |  |  |  |   (nth 3 (fuel-eval--error-lexer-p err))) | 
					
						
							| 
									
										
										
										
											2008-12-05 22:34:25 -05:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |  | 
					
						
							|  |  |  |  | (provide 'fuel-eval) | 
					
						
							|  |  |  |  | ;;; fuel-eval.el ends here |