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 +1 -1
- data/TODO +2 -1
- data/examples/classes_modules.bt +49 -0
- data/examples/webserver.bt +10 -5
- data/grammar/blocktalk.rb +20 -2
- data/grammar/blocktalk.tt +1 -1
- data/lib/kernel/class.rb +3 -8
- data/lib/kernel/module.rb +20 -6
- data/lib/kernel/object.rb +12 -0
- data/lib/kernel/system.rb +1 -5
- data/parser/nodes/class_method_definition.rb +1 -1
- data/version.rb +3 -0
- metadata +2 -1
data/README.markdown
CHANGED
data/TODO
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
##################
|
2
|
-
# TODO for v0.
|
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
|
|
data/examples/classes_modules.bt
CHANGED
@@ -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)
|
data/examples/webserver.bt
CHANGED
@@ -6,8 +6,13 @@ System require: "socket"
|
|
6
6
|
require: "lib/blocktalk"
|
7
7
|
|
8
8
|
Class >> :Logger do
|
9
|
-
def
|
10
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
4286
|
+
r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
4286
4287
|
@index += 1
|
4287
4288
|
else
|
4288
|
-
|
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 =
|
11
|
+
classobj = current_module.const_get(class_name_sym)
|
11
12
|
classobj.class_eval(&block)
|
12
13
|
rescue
|
13
|
-
|
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
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
data/lib/kernel/system.rb
CHANGED
@@ -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}\"
|
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
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.
|
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
|