;;; -*- lexical-binding: t -*- ;; ;; -------------------------------------------------------------------------------- (require 'cl-lib) (cl-pushnew "." load-path :test #'string=) (require 'luki-lisp) ;; -------------------------------------------------------------------------------- (-> 'pcomplete) ;; -------------------------------------------------------------------------------- (defun el-pa-ask (name-src host-src port-src name-dst host-dst port-dst var-name code-str) (i) (let ((proc (open-network-stream name-dst nil host-dst port-dst)) (msg-full (@f "%s@%s:%s;%s.%s" name-src host-src port-src var-name code-str))) (process-send-string proc msg-full) (delete-process proc))) ;; -------------------------------------------------------------------------------- (defun el-pa-reply (name-dst host-dst port-dst var-name res) (let ((proc (open-network-stream name-dst nil host-dst port-dst)) (msg-full (@f "%s.%s" var-name res))) (process-send-string proc msg-full) (delete-process proc))) ;; -------------------------------------------------------------------------------- (defun el-pa-get-msg (msg) (let ((data (split-string msg "[@:.;]"))) (pcase-let* ((`(,sender ,host ,port ,var-name ,code-str) data)) (if (and sender host port var-name code-str) (let ((res (eval (1st (read-from-string code-str))))) (el-pa-reply sender host port var-name res)) (if (and sender host) ;; actually not sender, host but variable name, result (set (intern sender) host) ;; TODO: will always be a string ($ "bogus message was received")))))) ;; -------------------------------------------------------------------------------- (defun el-pa-make-process (name port) (make-network-process :name name :service port :server t :filter (L (_ msg) (el-pa-get-msg msg)))) ;; -------------------------------------------------------------------------------- (defun el-pa-comp-init (&optional name port) (or name (setq name "emacs-comp")) (or port (setq port 8888)) (el-pa-make-process name port)) (defun el-pa-comp-kill (&optional name) (or name (setq name "emacs-comp")) (delete-process name)) ;; -------------------------------------------------------------------------------- (defun el-pa-prop-init () (defvar var-data) (setq var-data 'not-set) (el-pa-make-process "emacs-prop" 9999)) (defun el-pa-prop-kill () (i) (delete-process "emacs-prop")) ;; -------------------------------------------------------------------------------- (defun el-pa-prop-ask (comp-str) (i) (defvar var-data) (el-pa-ask "emacs-prop" "localhost" 9999 "emacs-comp" "localhost" 8888 'var-data comp-str) (cl-loop while (eq var-data 'not-set) do (sleep-for 1)) var-data) ;; ----------------------------------------------------------------------------- (defun el-pa-sort (lst) (let* ((len (floor (--- lst) 2)) (split (seq-split lst len)) (local (1st split)) local-sorted (remote (2nd split))) (defvar el-pa-res) (setq el-pa-res 'not-set) (el-pa-ask "emacs-prop" "localhost" 9999 "emacs-comp" "localhost" 8888 "el-pa-res" (@f "(sort \'%s)" remote)) (setq local-sorted (sort local)) (cl-loop while (eq el-pa-res 'not-set) do (sleep-for 0.0001)) (cl-merge 'list local-sorted el-pa-res #'<))) (defun test-el-pa-sort (&optional max len) (or max (setq max (** 2 9))) (or len (setq len max)) (let ((lst (cl-map 'list (L (_) (1+ (random max))) (make-list len nil))) beg-sort end-sort beg-el-pa-sort end-el-pa-sort) (setq beg-sort (float-time)) (ignore (funcall #'sort lst)) (setq end-sort (float-time)) (setq beg-el-pa-sort (float-time)) (ignore (funcall #'el-pa-sort lst)) (setq end-el-pa-sort (float-time)) (/ (- end-el-pa-sort beg-el-pa-sort) (- end-sort beg-sort)))) ;; ----------------------------------------------------------------------------- (when nil (el-pa-comp-init)) (when nil (el-pa-prop-init)) (when nil ($ "%.1f" (test-el-pa-sort (** 2 8))) ) ;; ----------------------------------------------------------------------------- ;; ;; (list-processes) ;; (el-pa-comp-kill) ;; (el-pa-comp-init) ;; (el-pa-prop-kill) ;; (el-pa-prop-init) ;; (el-pa-prop-ask "(1+ 11)") ;; (el-pa-prop-ask "(sort (list 3 1 2))") ;; ;; ----------------------------------------------------------------------------- (<- 'll-el-pa)