bakkdoor-blocktalk 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.markdown CHANGED
@@ -1,5 +1,5 @@
1
1
  # ***Blocktalk*** #
2
- ### **v0.1.5** ###
2
+ ### **v0.1.6** ###
3
3
 
4
4
  ## **Blocktalk** is a dynamic, object-oriented programming language somewhat in the tradition of Smalltalk and Ruby. ##
5
5
 
data/TODO CHANGED
@@ -1,7 +1,8 @@
1
1
  ##################
2
- # TODO for v0.1: #
2
+ # TODO for v0.2: #
3
3
  ##################
4
4
 
5
+ - some nicer support for ruby getter & setter methods
5
6
  - add optimizations, when possible
6
7
  - add more documentation & enhance standard library (as much as possible in Blocktalk itself)
7
8
 
@@ -66,3 +66,52 @@ Console puts: (chris distance_to: city)
66
66
  chris method_a
67
67
  chris method_b
68
68
  chris method_c: "hey" and: "ho" plus: "cool!"
69
+
70
+
71
+ # nested modules need to be introduces like this
72
+ Module >> :F do
73
+ Module >> :G do
74
+ Module >> :H do
75
+ def self bar = do
76
+ Console puts: "Nested modules: In F::G::H#bar"
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ F::G::H bar
83
+
84
+
85
+ #extend an existing module
86
+ Module >> :F do
87
+ def self blubb = do
88
+ Console puts: "In F#blubb"
89
+ end
90
+ end
91
+
92
+ F blubb
93
+
94
+ F::G::H bar # this still works!
95
+
96
+ Module >> :C do
97
+ Module >> :D do
98
+ Module >> :E do
99
+ Module >> :F do
100
+ def self foo = do
101
+ Console puts: "In C::D::E::F#foo"
102
+ end
103
+ Class >> :G do
104
+ def bar = do
105
+ Console puts: "In instance method: C::D::E::F::G#bar"
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ C::D::E::F foo
114
+
115
+ g = C::D::E::F::G new
116
+ g bar
117
+ Console puts: (g class)
@@ -6,8 +6,13 @@ System require: "socket"
6
6
  require: "lib/blocktalk"
7
7
 
8
8
  Class >> :Logger do
9
- def initialize = do |logfile|
10
- @log_file = logfile
9
+ def logfile = do |logfile|
10
+ # this makes sure, we return self at the end for easy methodchaining like in smalltalk
11
+ # e.g.:
12
+ # log = Logger new logfile: file
13
+ self chainable {
14
+ @log_file = logfile
15
+ }
11
16
  end
12
17
 
13
18
  def log = do |message|
@@ -80,7 +85,7 @@ Class >> :Webserver do
80
85
  Console puts: "OOPS: #{ex inspect}"
81
86
  end
82
87
 
83
- ensure{
88
+ ensure{
84
89
  (src nil?) if_false {
85
90
  src close
86
91
  }
@@ -125,9 +130,9 @@ File open: logfile_name mode: "w+" do |logfile|
125
130
  {port = ARGV at: 0} if: (ARGV at: 0)
126
131
 
127
132
  server = TCPServer new: 'localhost' port: port
128
- logger = Logger new: logfile
133
+ logger = Logger new logfile: logfile
129
134
 
130
- Kernel loop do
135
+ System loop do
131
136
  session = server accept
132
137
  request = session gets
133
138
  logStr = "#{session peeraddr at: 2} (#{session peeraddr at: 3})\n"
data/grammar/blocktalk.rb CHANGED
@@ -4281,11 +4281,29 @@ module Blocktalk
4281
4281
  if r5
4282
4282
  s11, i11 = [], index
4283
4283
  loop do
4284
+ i12 = index
4284
4285
  if input.index(Regexp.new('[a-zA-Z0-9_]'), index) == index
4285
- r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
4286
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
4286
4287
  @index += 1
4287
4288
  else
4288
- r12 = nil
4289
+ r13 = nil
4290
+ end
4291
+ if r13
4292
+ r12 = r13
4293
+ else
4294
+ if input.index('::', index) == index
4295
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 2))
4296
+ @index += 2
4297
+ else
4298
+ terminal_parse_failure('::')
4299
+ r14 = nil
4300
+ end
4301
+ if r14
4302
+ r12 = r14
4303
+ else
4304
+ self.index = i12
4305
+ r12 = nil
4306
+ end
4289
4307
  end
4290
4308
  if r12
4291
4309
  s11 << r12
data/grammar/blocktalk.tt CHANGED
@@ -396,7 +396,7 @@ grammar Blocktalk do
396
396
  # names - basically anything, that you can store something in or
397
397
  # assign to.
398
398
  rule identifier do
399
- ('@' / '@@')? ([a-zA-Z]+ / '$' [0-9]) [a-zA-Z0-9_]* <IdentifierNode>
399
+ ('@' / '@@')? ([a-zA-Z]+ / '$' [0-9]) ([a-zA-Z0-9_] / '::')* <IdentifierNode>
400
400
  end
401
401
 
402
402
  # possible names for messages / methods
data/lib/kernel/class.rb CHANGED
@@ -6,11 +6,12 @@ class Class
6
6
  def self.in__subclassing(class_name_sym, superclass = Object, &block)
7
7
  # try to find class via const_get
8
8
  # if error occurs (not found), define a new class with the given name
9
+ current_module = Module.current
9
10
  begin
10
- classobj = Kernel::const_get(class_name_sym)
11
+ classobj = current_module.const_get(class_name_sym)
11
12
  classobj.class_eval(&block)
12
13
  rescue
13
- Kernel::const_set(class_name_sym, Class.new(superclass, &block))
14
+ current_module.const_set(class_name_sym, Class.new(superclass, &block))
14
15
  end
15
16
  end
16
17
 
@@ -37,10 +38,4 @@ class Class
37
38
  end
38
39
  end
39
40
  end
40
-
41
- def meta_class
42
- class << self
43
- self
44
- end
45
- end
46
41
  end
data/lib/kernel/module.rb CHANGED
@@ -1,11 +1,25 @@
1
1
  class Module
2
+ @@mod_stack = []
2
3
  def self.in(module_name_sym, &block)
3
- if Kernel::constants.include?(module_name_sym.to_s)
4
- moduleobj = Kernel::const_get(module_name_sym)
5
- moduleobj.module_eval(&block)
6
- else
7
- Kernel::const_set(module_name_sym, Module.new(&block))
8
- end
4
+ parent_mod = (["Kernel"] + @@mod_stack).join('::')
5
+
6
+ str = <<-REND
7
+ unless #{parent_mod}.const_defined?('#{module_name_sym}')
8
+ #{parent_mod}.module_eval '#{module_name_sym} = Module.new'
9
+ end
10
+ REND
11
+ Kernel.module_eval str
12
+
13
+ @@mod_stack.push module_name_sym
14
+
15
+ mod = Kernel.module_eval("#{@@mod_stack.join('::')}")
16
+ mod.module_eval(&block)
17
+
18
+ @@mod_stack.pop
19
+ end
20
+
21
+ def self.current
22
+ Kernel.eval((["Kernel"] + @@mod_stack).join("::"))
9
23
  end
10
24
 
11
25
  def self.>>(module_name_sym, &block)
data/lib/kernel/object.rb CHANGED
@@ -71,4 +71,16 @@ class Object
71
71
  raise "Unknown method, don't know what to do: #{self.class}##{name}"
72
72
  end
73
73
  end
74
+
75
+ def chainable(&block)
76
+ block.call
77
+ self
78
+ end
79
+
80
+
81
+ def meta_class
82
+ class << self
83
+ self
84
+ end
85
+ end
74
86
  end
data/lib/kernel/system.rb CHANGED
@@ -1,5 +1 @@
1
- class System
2
- def self.require(file)
3
- Kernel::require(file)
4
- end
5
- end
1
+ System = Kernel
@@ -8,7 +8,7 @@ module Blocktalk
8
8
  "self.meta_class.class_eval{define_method(:#{method_name_with_params}, &#{method_body.value})}"
9
9
  else
10
10
  # no parameters given -> simply call define_method with a param-less block
11
- "self.meta_class.class_eval{define_method(\"#{method_name.value}\", &#{method_body.body.value})}"
11
+ "self.meta_class.class_eval{define_method(\"#{method_name.value}\"){#{method_body.body.value}}}"
12
12
  end
13
13
  end
14
14
  end
data/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ def blocktalk_version
2
+ return "0.1.6"
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bakkdoor-blocktalk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Bertels
@@ -36,6 +36,7 @@ files:
36
36
  - TODO
37
37
  - LICENSE
38
38
  - evaluator.rb
39
+ - version.rb
39
40
  - grammar/blocktalk.tt
40
41
  - grammar/blocktalk.rb
41
42
  - lib/core.rb