bakkdoor-blocktalk 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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