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 +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
|