Compare commits

..

4 Commits

Author SHA1 Message Date
076fce6e52 Add README.org 2025-11-11 13:09:50 +00:00
4514f9c8e8 Changes backlog 2025-11-10 16:55:28 +01:00
9cf2e4476c fix broken stuff 2025-08-19 23:48:31 +02:00
1bb55f4d36 add missing func back 2025-08-19 23:08:50 +02:00
6 changed files with 89 additions and 7 deletions

3
README.org Normal file
View File

@@ -0,0 +1,3 @@
* EMPTYHEAD
WIP +overengineered game engine+ programming language VM/runtime
Apologies for the mess/lack of documentation, it's slowly moving towards something that's easier to explain but currently on a bit of a research break as I nail down language semantics

View File

@@ -0,0 +1,71 @@
(ns emptyhead.lib.object.core
(:require [emptyhead.thought.crud :as thought]
[emptyhead.thought.define :as def]
[emptyhead.idea.property :as prop]
[emptyhead.thought.extend :as extend]
[emptyhead.thought.eval :as eval]
))
(def/define! [:EH :CORE :RETURN]
(fn [thought parent]
[parent (thought/data thought)]))
(def/define! [:EH :DEBUG :PRINT-DATA]
(fn [thought parent]
(print (thought/data thought))
[parent nil]))
(def/define! [:EH :NOP] (fn [parent _] [parent nil]))
(def/define! [:EH :CALL] (fn [parent _] [parent nil]))
(def/define! [:EH :DEBUG :WHOAMI]
(fn [_ parent]
(let [[_ self] (thought/pop-stack parent)]
(println "Hello from " self "!")
(println parent)
[parent nil])))
(def/define! [:EH :DEBUG :PRINT-TOS]
(fn [_ parent]
(let [[parent self] (thought/pop-stack parent)
[_ stack] (thought/pop-stack parent)
val (last stack)]
(println val)
[parent nil])))
(def sexer (thought/register-thought! [:EH :DEBUG :WHOAMI]))
;; TODO magic identifiers
(defn create []
[:EH :OBJ (keyword (gensym "O-"))])
(defn extend [object name daughter]
(extend/register-extension!
(thought/register-thought! [:EH :CORE :RETURN] :data daughter)
(conj object name)))
(defn implement [object thought]
(extend/register-extension! thought (conj object :_CALL)))
(defn call [object thought]
(eval/execute!
(thought/make-thought [:EH :CALL]
:return [(thought/stack thought) object]
:ext-stages [(conj object :_CALL)])
thought))
(defn val->obj [val]
(let [obj (create)
val-th (thought/register-thought! [:EH :CORE :RETURN] :data val)]
(implement obj val-th)
obj))
(defn th->obj [op & [data]]
(let [obj (create)
val-th (thought/register-thought! op :data data)]
(implement obj val-th)
obj))
(defn val->obj [val]
(th->obj [:EH :CORE :RETURN] val))

View File

@@ -8,13 +8,14 @@
(defn make-thought
"Helper function to make thought object.
You may want `register-thought!` instead."
[operator & {:keys [data ext-stages]
[operator & {:keys [data ext-stages return]
:or {data {}
ext-stages [[:PRE-EXECUTE] [:EXECUTE] [:POST-EXECUTE]]}}]
ext-stages [[:PRE-EXECUTE] [:EXECUTE] [:POST-EXECUTE]]
return []}}]
(hash-map :operator operator
:data data
:ext-stages ext-stages
:return []))
:return return))
(defn register-thought!
"Create a thought and register it in the state.

View File

@@ -14,12 +14,14 @@
(if-not impl-idea
(logging/error (str "No implementation for thought `" (thought/operator thought) "`.")
{:thought thought :parent parent :type :unimplemented-thought})
((:implementation impl-idea) thought parent))))
((prtc/val-fn :implementation impl-idea) thought parent))))
;; FIXME I don't think omitting the parent here is actually valid?
;; might need to use thought.crud/root-thought, but better making parent mandatory tabun
(defn execute!
"Execute `thought` with `parent`, applying aspects to `thought` according to its :extension-stages.
Returns (potentially modified) `parent`."
[thought parent]
[thought & [parent]]
(loop [th (prtc/val-fn #(assoc % :_parent (prtc/value parent)) thought)
parent parent]
(let [[extensions th cur] (extend/pop-stage th)

View File

@@ -3,11 +3,11 @@
(:require [emptyhead.idea.protocol :as prtc]))
(defn with-return
"Returns a copy of the thought with all values in data
"Returns the thought with all values in data
added to the top of its stack."
[thought data]
(if (first data)
(prtc/copy-fn
(prtc/val-fn
#(update % :return (fnil into []) data) thought)
thought))

View File

@@ -9,5 +9,10 @@
(defn thought-impl-prop [operator]
(conj thought-impl-ns operator))
(def extension-ns (conj thought-ns :extends))
(defn extension-prop [stage]
(conj extension-ns stage))
(defn symbolize-ns [ns]
(str/join "." (map name ns)))