Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
;;; This file:
;;;   http://angg.twu.net/emacs-lua/emlua.el.html
;;;   http://angg.twu.net/emacs-lua/emlua.el
;;;           (find-angg "emacs-lua/emlua.el")
;;;      See: (find-angg "emacs-lua/emlua.cpp")
;;; Author: Eduardo Ochs <[email protected]>
;;; Version: 2021may11
;;; License: public domain.
;;;
;;; (defun e () (interactive) (find-angg "emacs-lua/emlua.cpp"))
;;; (defun l () (interactive) (find-angg "emacs-lua/emlua.el"))
;;;
;;; This file contains some support functions for Nerditation's
;;; emlua.cpp.


;; «.emlua-format»		(to "emlua-format")
;; «.emlua-quote»		(to "emlua-quote")
;; «.load-everything»		(to "load-everything")
;; «.eepitch-emlua»		(to "eepitch-emlua")
;; «.eepitch-emlua-repl»	(to "eepitch-emlua-repl")
;; «.emlua-eval-this»		(to "emlua-eval-this")




;;;                 _                                     _       
;;;   ___ _ __ ___ | |_   _  __ _        __ _ _   _  ___ | |_ ___ 
;;;  / _ \ '_ ` _ \| | | | |/ _` |_____ / _` | | | |/ _ \| __/ _ \
;;; |  __/ | | | | | | |_| | (_| |_____| (_| | |_| | (_) | ||  __/
;;;  \___|_| |_| |_|_|\__,_|\__,_|      \__, |\__,_|\___/ \__\___|
;;;                                        |_|                    
;;
;; «emlua-format»  (to ".emlua-format")
;; «emlua-quote»  (to ".emlua-quote")

;; Example: (emlua-format "a[%s] = %s"   2.34 "foo")
;;                  --> "a[2.34] = [=[foo]=]"
;;
(defun emlua-format (fmt &rest rest)
  (apply 'format fmt (mapcar 'emlua-quote rest)))

;; Examples: (emlua-quote  2.4)
;;                    --> "2.4"
;;           (emlua-quote "foo")
;;                 --> "[=[foo]=]"
;;
(defun emlua-quote (o)
  (if (stringp o) (emlua-bracket-quote o) (format "%S" o)))

;; Example: (emlua-bracket-quote ".[=[ FOO ]===].")
;;                     --> "[==[.[=[ FOO ]===].]==]"
;;
(defun emlua-bracket-quote (string)
  (let ((core (emlua-bracket-new-core (emlua-bracket-hash-table string))))
    (format "[%s[%s]%s]" core string core)))

;; Based on: (find-efunction 'replace-regexp-in-string)
;;      See: (find-elnode "Creating Hash")
;;           (find-elnode "Hash Access")
;;     Test: (emlua-bracket-hash-table "[==[]===]")
;;
(defun emlua-bracket-hash-table (string)
  (let* ((regexp (rx (any "[]") (one-or-more "=") (any "[]")))
         (hash-table (make-hash-table))
         (l (length string))
	 (start 0)
         mb me)
    (save-match-data
      (while (and (< start l) (string-match regexp string start))
	(setq mb (match-beginning 0)
	      me (match-end 0))
        (puthash (- me mb 2) t hash-table)
	(setq start me))
      hash-table)))

;; Tests:
;; (setq ht (emlua-bracket-hash-table "[==[]===]"))
;; (setq ht (emlua-bracket-hash-table "[=[ ]===]"))
;; (gethash 1 ht)
;; (gethash 2 ht)
;; (emlua-bracket-new-core ht)
;;
(defun emlua-bracket-new-core (hash-table)
  (cl-loop for k from 1
           do (if (not (gethash k hash-table))
		  (cl-return (make-string k ?=)))))





;;;  _                 _ 
;;; | | ___   __ _  __| |
;;; | |/ _ \ / _` |/ _` |
;;; | | (_) | (_| | (_| |
;;; |_|\___/ \__,_|\__,_|
;;;                      
;; «load-everything»  (to ".load-everything")

(setq emlua-dot-so       "~/emacs-lua/emlua.so")
(setq emlua-dot-el       "~/emacs-lua/emlua.el")
(setq emlua-luainit-file "~/LUA/lua50init.lua")
(setq emlua-edrxrepl-dir "~/emacs-lua/")

;; Test: (find-estring (emlua-init-lua-0))
;;
(defun emlua-init-lua-0 ()
  (format "
     dofile '%s'
     package.path = '%s?.lua;'..package.path
     require 'edrxrepl'
     REPL = EdrxRepl.new()
     return EdrxRepl, PP
     "
     (ee-expand emlua-luainit-file)
     (ee-expand emlua-edrxrepl-dir)))

;; Test: (emlua-load-all)
;;
(defun emlua-load-all ()
  (list (load emlua-dot-so)
	(emlua-dostring (emlua-init-lua-0))))




;;;                  _ _       _                          _             
;;;   ___  ___ _ __ (_) |_ ___| |__         ___ _ __ ___ | |_   _  __ _ 
;;;  / _ \/ _ \ '_ \| | __/ __| '_ \ _____ / _ \ '_ ` _ \| | | | |/ _` |
;;; |  __/  __/ |_) | | || (__| | | |_____|  __/ | | | | | | |_| | (_| |
;;;  \___|\___| .__/|_|\__\___|_| |_|      \___|_| |_| |_|_|\__,_|\__,_|
;;;           |_|                                                       
;;
;; «eepitch-emlua»  (to ".eepitch-emlua")
;; See: (find-eev "eepitch.el" "eepitch-vterm")
;;      (find-eev "eepitch.el" "eepitch-this-line")
;;
(defface emlua-prompt-face
  '((t (:foreground "RoyalBlue3")))
  "")

(defface emlua-user-input-face
  '((t (:foreground "orange1")))
  "")




;;;                 _                                  _ 
;;;   ___ _ __ ___ | |_   _  __ _       _ __ ___ _ __ | |
;;;  / _ \ '_ ` _ \| | | | |/ _` |_____| '__/ _ \ '_ \| |
;;; |  __/ | | | | | | |_| | (_| |_____| | |  __/ |_) | |
;;;  \___|_| |_| |_|_|\__,_|\__,_|     |_|  \___| .__/|_|
;;;                                             |_|      
;;
;; «eepitch-emlua-repl»  (to ".eepitch-emlua-repl")

(defun eepitch-emlua ()
  "Setup eepitch-ing to an emlua buffer.
This function is a prototype that only works in a controlled setting."
  (interactive)
  (eepitch '(find-ebuffer "*emlua*"))
  (setq eepitch-line 'eepitch-emlua-esend))

;; See: (find-angg "edrxrepl/edrxrepl.lua" "EdrxRepl-emacs")
;;      (find-angg "edrxrepl/edrxrepl.lua" "EdrxRepl-emacs" "erepltest =")
;;      (find-angg "edrxrepl/edrxrepl.lua" "EdrxRepl-emacs" "esend =")
;;
(defun eepitch-emlua-insert (str &optional face)
  "Insert STR at the end of the emlua buffer."
  (if face (setq str (propertize str 'face face)))
  (eepitch-eval-at-target-window
   '(progn (goto-char (point-max))
	   (insert str))))

(defun eepitch-emlua-prompt ()
  "Insert the result of REPL:eprompt() at the end of the *emlua* buffer."
  (eepitch-emlua-insert
   (aref (emlua-dostring "return REPL:eprompt()") 0)
   'emlua-prompt-face))

(defvar eepitch-emlua-esend0 nil
  "The results of the last call to `eepitch-emlua-esend0'.")

(defun eepitch-emlua-esend0 (line)
  "Run REPL:esend(LINE) and save the results in `eepitch-emlua-esend0'."
  (setq eepitch-emlua-esend0
	(emlua-dostring
	 (format "return REPL:esend(%s)"
		 (emlua-quote line)))))

(defun eepitch-emlua-esend1 ()
  "Insert the results in `eepitch-emlua-esend0' in the right way."
  (let* ((rets eepitch-emlua-esend0)
	 (len  (length rets))
         (ret0 (aref rets 0))
	 (ret1 (and (< 1 (length rets)) (aref rets 1))))
    (if ret1 (eepitch-emlua-insert ret1))))

(defun eepitch-emlua-esend (line)
  (eepitch-emlua-insert (format "%s\n" line) 'emlua-user-input-face)
  (eepitch-emlua-esend0 line)
  (eepitch-emlua-esend1)
  (eepitch-emlua-prompt))





;;;                 _                                   _       _   _     _     
;;;   ___ _ __ ___ | |_   _  __ _        _____   ____ _| |     | |_| |__ (_)___ 
;;;  / _ \ '_ ` _ \| | | | |/ _` |_____ / _ \ \ / / _` | |_____| __| '_ \| / __|
;;; |  __/ | | | | | | |_| | (_| |_____|  __/\ V / (_| | |_____| |_| | | | \__ \
;;;  \___|_| |_| |_|_|\__,_|\__,_|      \___| \_/ \__,_|_|      \__|_| |_|_|___/
;;;                                                                             
;; «emlua-eval-this»  (to ".emlua-eval-this")

(defun emlua-eval-this ()
  (eval (ee-read (aref (emlua-dostring "return eval_this") 0))))