From cae16e6c034808199f12a37ec0bdb4822c988dca Mon Sep 17 00:00:00 2001 From: olpc user Date: Tue, 26 Nov 2019 12:25:58 -0800 Subject: switch data to use std::any and merge value struct with concept --- starts/meaning-vm/DESIGN.txt | 13 +++++++++-- starts/meaning-vm/level-0/baseref.hpp | 6 ++--- starts/meaning-vm/level-0/common.hpp | 2 -- starts/meaning-vm/level-0/concept.hpp | 8 +++++-- starts/meaning-vm/level-0/level-0.hpp | 1 - starts/meaning-vm/level-0/memorystore.cpp | 5 +++-- starts/meaning-vm/level-0/memorystore.hpp | 7 +++--- starts/meaning-vm/level-0/value.hpp | 25 --------------------- starts/meaning-vm/level-1/baseref.hpp | 4 ++-- starts/meaning-vm/level-1/common.hpp | 1 - starts/meaning-vm/level-1/funcs.cpp | 37 ++++++++++++++++++------------- starts/meaning-vm/level-1/funcs.hpp | 5 ++--- starts/meaning-vm/makefile | 4 +--- 13 files changed, 53 insertions(+), 65 deletions(-) delete mode 100644 starts/meaning-vm/level-0/value.hpp (limited to 'starts') diff --git a/starts/meaning-vm/DESIGN.txt b/starts/meaning-vm/DESIGN.txt index 80e446f..295a7f2 100644 --- a/starts/meaning-vm/DESIGN.txt +++ b/starts/meaning-vm/DESIGN.txt @@ -32,6 +32,15 @@ Level-1 introduce the concept of groups, using the "is" link, and uses it to cat concepts that have an autogenerated name in the "anonymous" group. # LEVEL 2 -Level 2 will introdue syntax sugar for quickly instantiating conceptual relationships -using operators. This is handled by creating syntax expression concepts. +Whatever gets implemented next. Maybe expression operators, maybe structure promises, +maybe infrastructure for moving implementation onto ref code objects. +# FUTURE +## Relevence pattern matching + This is important and core. + This appears similar to graph structure matching, except that code creatively relevent to + the parts of the structure must be continually run so as to generate new information, + new structural parts. + At its simplest, this solves (A is not a dog), (A is a cat), (cats are never dogs), + with logical habits relevent to 'not', 'never', 'is', using one single matching interface, + but with more relevence could do more. diff --git a/starts/meaning-vm/level-0/baseref.hpp b/starts/meaning-vm/level-0/baseref.hpp index 849e205..205b422 100644 --- a/starts/meaning-vm/level-0/baseref.hpp +++ b/starts/meaning-vm/level-0/baseref.hpp @@ -49,12 +49,12 @@ public: } template - T& vget(ref const & type) const { return p->vget(type.p)->data; } + T& vget(ref const & type) const { return p->vget(type.p); } template - void vset(ref const & type, T const & v) { p->set(type.p, valloc(v)); } + void vset(ref const & type, T const & v) { p->set(type.p, alloc(v)); } template - T& val() { return p->val()->data; } + T& val() { return p->val(); } operator concept*() const { return p; } concept*& ptr() { return p; } diff --git a/starts/meaning-vm/level-0/common.hpp b/starts/meaning-vm/level-0/common.hpp index 74031cc..6e86907 100644 --- a/starts/meaning-vm/level-0/common.hpp +++ b/starts/meaning-vm/level-0/common.hpp @@ -7,8 +7,6 @@ namespace level0 { struct concept; struct ref; -template struct value; -template struct vref; } namespace level1 { struct ref; template struct vref; } diff --git a/starts/meaning-vm/level-0/concept.hpp b/starts/meaning-vm/level-0/concept.hpp index 3bd1609..d57ccfc 100644 --- a/starts/meaning-vm/level-0/concept.hpp +++ b/starts/meaning-vm/level-0/concept.hpp @@ -2,6 +2,7 @@ #include "common.hpp" +#include #include #include @@ -12,6 +13,9 @@ struct concept { // a concept is made of concept-typed links to other concepts std::multimap links; + // and optional associated arbitrary data + std::any data; + using array = std::vector; concept* id(); @@ -30,10 +34,10 @@ struct concept void set(concept* type, concept* target); template - value* vget(concept* type) const { return static_cast*>(get(type)); } + T & vget(concept* type) const { return get(type)->val(); } template - value* val() { return this; } + T & val() { return std::any_cast(data); } }; } diff --git a/starts/meaning-vm/level-0/level-0.hpp b/starts/meaning-vm/level-0/level-0.hpp index 7062be0..56cd7dd 100644 --- a/starts/meaning-vm/level-0/level-0.hpp +++ b/starts/meaning-vm/level-0/level-0.hpp @@ -5,4 +5,3 @@ #include "errors.hpp" #include "memorystore.hpp" #include "ref.hpp" -#include "value.hpp" diff --git a/starts/meaning-vm/level-0/memorystore.cpp b/starts/meaning-vm/level-0/memorystore.cpp index b092ca0..adae8b2 100644 --- a/starts/meaning-vm/level-0/memorystore.cpp +++ b/starts/meaning-vm/level-0/memorystore.cpp @@ -14,8 +14,9 @@ static auto & concepts() return concepts; } -ref alloc(concept * moved) { - ref r = moved ? moved : new concept(); +ref alloc(std::any data) { + concept * r = new concept(); + r->data = data; concepts().insert(r); return r; } diff --git a/starts/meaning-vm/level-0/memorystore.hpp b/starts/meaning-vm/level-0/memorystore.hpp index fd752a0..7843513 100644 --- a/starts/meaning-vm/level-0/memorystore.hpp +++ b/starts/meaning-vm/level-0/memorystore.hpp @@ -1,14 +1,13 @@ #pragma once #include "common.hpp" -#include "value.hpp" + +#include namespace intellect { namespace level0 { -ref alloc(concept * moved = 0); -template -value * valloc(T const & v) { return static_cast*>(alloc(new value(v)).ptr()); } +ref alloc(std::any data = {}); void dealloc(ref); std::size_t allocated(); diff --git a/starts/meaning-vm/level-0/value.hpp b/starts/meaning-vm/level-0/value.hpp deleted file mode 100644 index ff704bf..0000000 --- a/starts/meaning-vm/level-0/value.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "common.hpp" - -#include "concept.hpp" - -namespace intellect { -namespace level0 { - -template -struct value : public concept -{ - value(T const & val) : data(val) { } - - value(value const & val) = default; - - operator T&() { return data; } - operator T const &() const { return data; } - - T data; -}; - - -} -} diff --git a/starts/meaning-vm/level-1/baseref.hpp b/starts/meaning-vm/level-1/baseref.hpp index 8c358cc..e8bdcb9 100644 --- a/starts/meaning-vm/level-1/baseref.hpp +++ b/starts/meaning-vm/level-1/baseref.hpp @@ -21,8 +21,8 @@ struct baseref : public level0::baseref bool isa(ref group) const { return level1::isa(self, group); } bool isan(ref group) const { return isa(group); } - std::string const & name() const { return getname(self)->data; } - operator std::string const &() const { return getname(self)->data; } + std::string const & name() const { return getname(self); } + operator std::string const &() const { return getname(self); } operator char const *() const { return getname(self)->data.c_str(); } ref operator-(ref other) { return hyphenate(self.ptr(), other.ptr()); } diff --git a/starts/meaning-vm/level-1/common.hpp b/starts/meaning-vm/level-1/common.hpp index 2c9297b..73de3b4 100644 --- a/starts/meaning-vm/level-1/common.hpp +++ b/starts/meaning-vm/level-1/common.hpp @@ -6,7 +6,6 @@ namespace intellect { namespace level1 { using level0::concept; -using level0::value; template struct baseref; struct ref; diff --git a/starts/meaning-vm/level-1/funcs.cpp b/starts/meaning-vm/level-1/funcs.cpp index 3d0d88d..07f0eba 100644 --- a/starts/meaning-vm/level-1/funcs.cpp +++ b/starts/meaning-vm/level-1/funcs.cpp @@ -21,9 +21,9 @@ static auto & namestruct() name_t() : nameref(level0::alloc()) { - auto namestr = valloc("name"); + level0::ref namestr = alloc((std::string)("name")); nameref.set(nameref, namestr); - conceptsByName.emplace(namestr->data, nameref); + conceptsByName.emplace(namestr.val(), nameref); } } namestruct; return namestruct; @@ -37,14 +37,14 @@ concept* getnamed(std::string const & name) return res->second; } else { level1::ref con = level0::alloc(); - level0::value* namestr = level0::valloc(name); - ns.conceptsByName.emplace(namestr->data, con); + level0::ref namestr = level0::alloc(name); + ns.conceptsByName.emplace(namestr.val(), con); con.set(ns.nameref, namestr); return con.ptr(); } } -value* getname(concept* r) +std::string& getname(concept* r) { try { return r->vget(namestruct().nameref); @@ -63,24 +63,31 @@ bool isa(concept* member, concept* group) return false; } -template -value* valloc(T const & val) +concept* alloc(std::any val) { - auto ret = level0::valloc(val); + + ref ret = level0::alloc(val); std::stringstream ss; - // << val is making recursion - ss << typeid(T).name() << "(" << val << ")"; - ret->link(concepts::name, level0::valloc(ss.str())); + ss << val.type().name() << "("; + if (false); +#define t(T) \ + else if (val.type() == typeid(T)) { \ + ss << ret.val(); \ + } + t(uint8_t) t(int8_t) t(uint16_t) t(int16_t) + t(uint32_t) t(int32_t) t(uint64_t) t(int64_t) + t(bool) t(float) t(double) t(std::string) t(char const *) +#undef t + else { ss << "?"; } + ss << ")"; + ret.link(concepts::name, level0::alloc(ss.str())); return ret; } concept* hyphenate(concept* a, concept* b) { - return getnamed(getname(a)->data + "-" + getname(b)->data); + return getnamed(getname(a) + "-" + getname(b)); } -template value* valloc(std::string const & val); -template value* valloc(int const & val); - } } diff --git a/starts/meaning-vm/level-1/funcs.hpp b/starts/meaning-vm/level-1/funcs.hpp index eab37e5..741a5af 100644 --- a/starts/meaning-vm/level-1/funcs.hpp +++ b/starts/meaning-vm/level-1/funcs.hpp @@ -12,14 +12,13 @@ namespace intellect { namespace level1 { concept* getnamed(std::string const & name); -value* getname(concept* r); +std::string& getname(concept* r); bool isa(concept* member, concept* group); concept* hyphenate(concept* a, concept* b); -template -value* valloc(T const & val); +concept* alloc(std::any val); } } diff --git a/starts/meaning-vm/makefile b/starts/meaning-vm/makefile index f1b4b12..920987a 100644 --- a/starts/meaning-vm/makefile +++ b/starts/meaning-vm/makefile @@ -11,7 +11,5 @@ liblevel%.a: level-%/*.hpp ar ru $@ $^ ranlib $@ -#main: main.o concept.o helpers.o memorystore.o meaning.o -#*.o: *.hpp */*.hpp clean: - -rm *.o main level0 level1 level2 *.a */*.o + -rm *.o level? *.a */*.o -- cgit v1.2.3