From 99e0c0db1809003baaec96078c9cec172a5a26ed Mon Sep 17 00:00:00 2001 From: Torsten Ruger Date: Mon, 18 Aug 2014 13:01:52 +0300 Subject: [PATCH] cleanup --- lib/sof/README.md | 23 +++++++++++++---------- lib/sof/array.rb | 24 ++++++++++++++++++++++++ lib/sof/hash.rb | 24 ++++++++++++++++++++++++ lib/sof/node.rb | 43 +++---------------------------------------- 4 files changed, 64 insertions(+), 50 deletions(-) diff --git a/lib/sof/README.md b/lib/sof/README.md index 7647bd75..e662dc06 100644 --- a/lib/sof/README.md +++ b/lib/sof/README.md @@ -1,28 +1,30 @@ ### Reading the code -Knowing what's going on while coding salama is not so easy: Hnce the need to look at code dumps +Knowing what's going on while coding salama is not so easy: Hence the need to look at code dumps -Hence the need for a code/object file format (remeber an oo program is just objects, some data, some code, all objects) +Hence the need for a code/object file format (remember an oo program is just objects, some data, some code, all objects) -I started with yaml, which is nice in that it has a solid implementation, reads and writes, handles arbitrary objects, -handles graphs and is a sort of readable text format. +I started with yaml, which is nice in that it has a solid implementation, reads and writes, handles arbitrary objects, handles graphs and is a sort of readable text format. -But the sort of started to get to me, because 1) it's way to verbose and 2) does not allow for (easy) ordering. +But the sort of started to get to me, because +1) it's way to verbose (long files, object groups over many pages) and +2) does not allow for (easy) ordering. Also it was placing references in weird (first seen) places. To fix this i started on Sof, with an eye to expand it. The main starting goal was quite like yaml, but with -- more text per line, specifically objects with simle attributes to have a constructor like syntax +- more text per line, specifically objects with simple attributes to have a constructor like syntax +- also short versions of arrays and hashes - Shorter class names (no ruby/object or even ruby/struct stuff) - references at the most shallow level - a possibility to order attributes and specify attributes that should not be serialized ### Salama Object File -Ok, so we all heard about object files, it's the things compilers create so we don't have to have huge compiles and -can link them later. +Ok, so we all heard about object files, it's the things compilers create so we don't have to have +huge compiles and can link them later. Much fewer know what they include, and that is not because they are not very useful, but rather very complicated. @@ -32,8 +34,9 @@ An object machine must off course have it's own object files, because: - we would be forced to read the source every time (slow) - we would have no language independant format -And i was going to get there, juust not now. I mean i think it's a great idea to have many languages compile and run -on the same object machine. Not neccessarily my idea, but i haven't seen it pulled off. Not that i will. +And i was going to get there, juust not now. I mean i think it's a great idea to have many languages +compile and run on the same object machine. +Not neccessarily my idea, but i haven't seen it pulled off. Not that i will. I just want to be able to read my compiled code!! diff --git a/lib/sof/array.rb b/lib/sof/array.rb index 627739e4..17d7fbe7 100644 --- a/lib/sof/array.rb +++ b/lib/sof/array.rb @@ -7,3 +7,27 @@ Array.class_eval do node end end +module Sof + class ArrayNode < Node + def initialize + @children = [] + end + attr_reader :children + def add c + @children << c + end + def out io , level = 0 + long_out(io , level) + end + + private + def long_out io , level + indent = " " * level + @children.each_with_index do |child , i| + io.write "\n#{indent}" unless i == 0 + io.write "-" + child.out(io , level + 1) + end + end + end +end \ No newline at end of file diff --git a/lib/sof/hash.rb b/lib/sof/hash.rb index 264d0eac..d99e6693 100644 --- a/lib/sof/hash.rb +++ b/lib/sof/hash.rb @@ -1,3 +1,26 @@ +module Sof + class HashNode < Node + def initialize + @children = [] + end + attr_reader :children + def add key , val + @children << [key,val] + end + def out io , level = 0 + indent = " " * level + @children.each_with_index do |child , i| + key , val = child + io.write "\n#{indent}" unless i == 0 + io.write "-" + key.out(io , level + 1) + io.write ": " + val.out(io , level + 1) + end + end + end +end + Hash.class_eval do def to_sof_node(writer , level) node = Sof::HashNode.new() @@ -9,3 +32,4 @@ Hash.class_eval do node end end + diff --git a/lib/sof/node.rb b/lib/sof/node.rb index 248861c8..d7c8307c 100644 --- a/lib/sof/node.rb +++ b/lib/sof/node.rb @@ -3,6 +3,7 @@ module Sof #abstract base class for nodes in the tree class Node + include Util # must be able to output to a stream def out io ,level raise "abstract #{self}" @@ -13,36 +14,18 @@ module Sof def initialize data @data = data end - attr_accessor :data + attr_reader :data def out io , level io.write(data) end end - class ArrayNode < Node - def initialize - @children = [] - end - attr_reader :children - def add c - @children << c - end - def out io , level = 0 - indent = " " * level - @children.each_with_index do |child , i| - io.write "\n#{indent}" unless i == 0 - io.write "-" - child.out(io , level + 1) - end - end - end class ObjectNode < Node def initialize data @data = data @children = [] end - attr_reader :children - attr_accessor :data + attr_reader :children , :data def add k , v @children << [k,v] end @@ -58,24 +41,4 @@ module Sof end end end - class HashNode < Node - def initialize - @children = [] - end - attr_reader :children - def add key , val - @children << [key,val] - end - def out io , level = 0 - indent = " " * level - @children.each_with_index do |child , i| - key , val = child - io.write "\n#{indent}" unless i == 0 - io.write "-" - key.out(io , level + 1) - io.write ": " - val.out(io , level + 1) - end - end - end end