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:
|
|
|
|
|
|
|
|
|
|
(require 'fuel-syntax)
|
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)
|
2008-12-05 22:34:25 -05:00
|
|
|
|
|
2008-12-15 17:44:13 -05:00
|
|
|
|
(eval-when-compile (require 'cl))
|
|
|
|
|
|
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)
|
|
|
|
|
(case (car sexp)
|
|
|
|
|
(: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)
|
|
|
|
|
(factor (case sexp
|
|
|
|
|
(:rs 'fuel-eval-restartable)
|
|
|
|
|
(:nrs 'fuel-eval-non-restartable)
|
2009-01-11 08:15:26 -05:00
|
|
|
|
(:in (or (fuel-syntax--current-vocab) "fuel"))
|
2008-12-15 17:44:13 -05:00
|
|
|
|
(:usings `(:array ,@(fuel-syntax--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))
|
|
|
|
|
'(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))
|
|
|
|
|
|
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))
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
(defsubst fuel-eval--make-parse-error-retort (str)
|
2008-12-12 19:54:18 -05:00
|
|
|
|
(fuel-eval--retort-make (cons 'fuel-parse-retort-error str) nil))
|
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)
|
2008-12-17 15:44:41 -05:00
|
|
|
|
(if (fuel-eval--retort-p ret) ret
|
|
|
|
|
(fuel-eval--make-parse-error-retort ret)))
|
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
|