bakkdoor-blocktalk 0.1.2 → 0.1.3

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.2** ###
2
+ ### **v0.1.3** ###
3
3
 
4
4
  ## **Blocktalk** is a dynamic, object-oriented programming language somewhat in the tradition of Smalltalk and Ruby. ##
5
5
 
@@ -51,10 +51,10 @@ The example above shows, how a typicall if-then conditional could be written.
51
51
 
52
52
  Another example would be a while loop:
53
53
 
54
- i = (Console gets: "Please enter a number!") to_i
54
+ i = Console gets: "Please enter a number!" to_i
55
55
  {i < 10} while_true {
56
56
  Console print: "a smaller than b!"
57
- i = (Console gets: "Enter again!") to_i
57
+ i = Console gets: "Enter again!" to_i
58
58
  }
59
59
 
60
60
  In this case, while_true takes a ruby-like implicit block, noticeable by the absence of the colon after the methodname,
data/bin/blocktalk CHANGED
@@ -9,20 +9,35 @@ if ARGV.size < 1
9
9
  exit
10
10
  end
11
11
 
12
-
13
12
  load_path = ""
14
13
 
15
- if ARGV.join(" ").match(/\-I\s*(\S+)/)
14
+ if ARGV.join(" ") =~ /\-I\s*(\S+)/
16
15
  $: << File.expand_path($1)
17
16
  load_path = $1 + "/"
18
17
  end
19
18
 
19
+ # ruby 1.8 is default
20
+ ruby_implementation = "ruby"
21
+
22
+ if ARGV.join(" ") =~ /\--rubyimp (\S+)/
23
+ ruby_implementation = $1
24
+ puts "Using #{ruby_implementation} for Blocktalk"
25
+
26
+ # remove option from argv, since it's not used anymore:
27
+ idx = ARGV.index("--rubyimp")
28
+ ARGV.delete_at(idx)
29
+ ARGV.delete_at(idx) # rubyimp argument now is at this index
30
+ end
31
+
20
32
  require load_path + "lib/core"
21
33
  require load_path + "evaluator"
22
34
  require load_path + "parser/nodes"
35
+ require load_path + "version"
23
36
 
24
- require "pp"
25
-
37
+ if ARGV.include?("--version") || ARGV.include?("-v")
38
+ puts "blocktalk v#{blocktalk_version}"
39
+ exit
40
+ end
26
41
 
27
42
  parser_dynamic = ARGV.include?("--dynparser")
28
43
 
@@ -36,8 +51,16 @@ end
36
51
 
37
52
  parse_file = ARGV[0]
38
53
  parser = BlocktalkParser.new
54
+
39
55
  ast = parser.parse IO.read(parse_file)
40
56
 
57
+ # if parsig failed -> output error message with reason
58
+ unless ast
59
+ puts "ParseError in #{parse_file} (line #{parser.failure_line} / #{parser.failure_column}):"
60
+ puts "#{parser.failure_reason}"
61
+ exit
62
+ end
63
+
41
64
  # start evaluation process
42
65
  ast.evaluate
43
66
 
@@ -60,7 +83,7 @@ if ruby_output
60
83
  else
61
84
  # also pass any additional args in ARGV to Evaluator
62
85
  # (ARGV[0] is the name of the file to execute).
63
- Evaluator.eval(ARGV[1..-1])
86
+ Evaluator.eval(ruby_implementation, ARGV[1..-1])
64
87
 
65
88
  if debug_on
66
89
  puts
data/evaluator.rb CHANGED
@@ -8,9 +8,9 @@ class Evaluator
8
8
  end
9
9
  end
10
10
 
11
- def self.eval(argv = [])
11
+ def self.eval(ruby_implementation = "ruby", argv = [])
12
12
  # Kernel::eval @expressions.join(";")
13
- system("/usr/bin/env ruby -e '#{@expressions.join(';')}' #{argv.join(' ')}")
13
+ system("/usr/bin/env #{ruby_implementation} -e '#{@expressions.join(';')}' #{argv.join(' ')}")
14
14
  end
15
15
 
16
16
  def self.inspect
@@ -47,7 +47,7 @@ Class >> :Person {
47
47
 
48
48
  def distance_to = do |place|
49
49
  (place is_a?: Place) if_true: {
50
- dist = ((self place) coordinates) - (place coordinates)
50
+ dist = (self place coordinates) - (place coordinates)
51
51
  dist abs
52
52
  } if_false: {
53
53
  0.0
@@ -1,7 +1,7 @@
1
- ((ARGV size) > 0) if_true: {
1
+ (ARGV size) > 0 if_true: {
2
2
  filename = ARGV at: 0
3
3
  File open: filename do |f|
4
- Console puts: "#{filename} has #{f.readlines.size} lines!"
4
+ Console puts: "#{filename} has #{f readlines size} lines!"
5
5
  end
6
6
  } if_false: {
7
7
  Console puts: "Please specify a file to count lines on!"
data/examples/portscan.bt CHANGED
@@ -21,7 +21,7 @@ open_ports = []
21
21
  open_ports << port
22
22
 
23
23
  s = Socket getnameinfo: ["AF_INET", port, host]
24
- Console puts: ("\nPort #{port} (#{s[1]})" + " is open.")
24
+ Console puts: ("\nPort #{port} (#{s at: 1})" + " is open.")
25
25
 
26
26
  catch{
27
27
  Console print: "."
@@ -1,4 +1,5 @@
1
1
  # calling some ruby methods...
2
+ require: "lib/blocktalk/string"
2
3
 
3
4
  File open: "examples/test3.bt" mode: "r" do |f|
4
5
  (f readlines) each do |l|
@@ -8,7 +9,7 @@ end
8
9
 
9
10
  # and again, this time cached!
10
11
  File open: "examples/test3.bt" mode: "r" do |f|
11
- (f readlines) each do |l|
12
+ f readlines each do |l|
12
13
  Console puts: l
13
14
  end
14
15
  end
@@ -17,4 +18,5 @@ end
17
18
  str = "hello, world, how are you?"
18
19
  str2 = str gsub: "," with: "!"
19
20
  Console puts: str;
20
- puts: str2
21
+ puts: str2;
22
+ puts: (str at: (2 .. 5))
data/examples/test.bt CHANGED
@@ -1,33 +1,33 @@
1
1
  # this is just for demonstration
2
2
  # there probably won't be the need to require the console module from the
3
3
  # standard library every time you want to print something to the screen ;)
4
- System require: "console"
4
+ #System require: "console"
5
5
 
6
6
  # we support ruby-style blocks with do ... end and curly braces { ... }
7
- File open: "test.txt" mode: "w" do |f|
8
- f puts: "what's up, dog?!"
9
- f puts: "crazy shit, yo!"
10
- f puts: "hahaha!!"
11
- end
7
+ # File open: "test.txt" mode: "w" do |f|
8
+ # f puts: "whats up, dog?!"
9
+ # f puts: "crazy shit, yo!"
10
+ # f puts: "hahaha!!"
11
+ # end
12
12
 
13
- 10 to: 0 do |i|
13
+ 10 upto: 0 do |i|
14
14
  Console puts: i
15
15
  end
16
16
 
17
17
  i = 0
18
- (i < 10) while_true: do |i|
18
+ {i < 10} while_true do
19
19
  Console puts: i
20
- i incr
20
+ i = i + 1
21
21
  end
22
22
 
23
- numbers = [1,2,3,4,5] select: {|i| i < 3}
24
- numbers each: do |i|
25
- puts i
23
+ numbers = [1,2,3,4,5] select {|i| i < 3}
24
+ numbers each do |i|
25
+ Console puts: i
26
26
  end
27
27
 
28
- (1 .. 100) each: {|i| Console puts: i}
28
+ #(1 .. 100) each {|i| Console puts: i}
29
29
 
30
- squares = (1 .. 100) collect: {|i| i * i}
30
+ #squares = (1 .. 100) collect {|i| i * i}
31
31
 
32
32
 
33
33
  # define a square method
@@ -37,9 +37,11 @@ square = { |x|
37
37
 
38
38
  # or like this:
39
39
  abs = { |num|
40
- (num > 0) if_true {
40
+ num > 0 if_true {
41
41
  return num
42
42
  }
43
43
 
44
44
  num * -1
45
45
  }
46
+
47
+ Console puts: ([1,2,3,4,5] collect {|i| square call: i})
data/examples/test2.bt CHANGED
@@ -1,12 +1,12 @@
1
1
  foo = do |x|
2
- Console puts ("bkzubb: " + (x to_s))
2
+ Console puts: "bkzubb: #{x}"
3
3
  end
4
4
 
5
5
  bar = do
6
6
  100
7
7
  end
8
8
 
9
- Console puts: (foo call: 10)
9
+ foo call: 10
10
10
 
11
11
 
12
12
  [1,2,3] each { |x|
@@ -16,7 +16,7 @@ Console puts: (foo call: 10)
16
16
  # anonymous class
17
17
  c = Class new {
18
18
  def foo = do |x|
19
- Console puts: ("in foo: " + x)
19
+ Console puts: "in foo: #{x}"
20
20
  end
21
21
  }
22
22
 
@@ -27,7 +27,7 @@ obj foo: (10 to_s)
27
27
  # new class Foo
28
28
  Class >> :Foo do
29
29
  def bar = do |x|
30
- Console puts: ("in Foo#bar: " + (x to_s))
30
+ Console puts: "in Foo#bar: #{x}"
31
31
  end
32
32
  end
33
33
 
@@ -54,7 +54,7 @@ foo bazz
54
54
  Class >> {:MyArray => Array} do
55
55
  def crazy_ouput = do
56
56
  self each { |x|
57
- Console puts: ("craaaaaazy: " + (x to_s))
57
+ Console puts: "craaaaaazy: #{x}"
58
58
  }
59
59
  end
60
60
 
@@ -62,8 +62,8 @@ Class >> {:MyArray => Array} do
62
62
  i = 0
63
63
  arr = []
64
64
  {i < amount} while_true {
65
- arr << (self at: i)
66
- i = (i + 1)
65
+ arr << self at: i
66
+ i = i + 1
67
67
  }
68
68
 
69
69
  return: arr
@@ -73,9 +73,9 @@ Class >> {:MyArray => Array} do
73
73
  def my_each = do |block|
74
74
  i = 0
75
75
  {i < (self size)} while_true {
76
- curr_item = (self at: i)
76
+ curr_item = self at: i
77
77
  block call: curr_item
78
- i = (i + 1)
78
+ i = i + 1
79
79
  }
80
80
  end
81
81
  end
@@ -91,20 +91,16 @@ myarr crazy_ouput
91
91
 
92
92
  Console puts: (myarr class)
93
93
 
94
- Console puts: ((myarr take_n: 3) inspect)
94
+ Console puts: (myarr take_n: 3 inspect)
95
95
 
96
96
 
97
97
  myarr my_each: { |elem|
98
- Console puts: ("my_each: " + (elem to_s))
98
+ Console puts: "my_each: #{elem}"
99
99
  }
100
100
 
101
- # File open: "grammar/test2.blk" mode: "r" do |f|
102
- # Console puts: (f readlines)
103
- # end
104
-
105
101
  Class >> :MyClass do
106
102
  def funky = do |name|
107
- Console puts: ("in MyClass#funky with name=" + name)
103
+ Console puts: "in MyClass#funky with name = #{name}"
108
104
  end
109
105
  end
110
106
 
@@ -113,7 +109,7 @@ end
113
109
 
114
110
  Module >> :MyModule {
115
111
  def test = do |bar|
116
- Console puts: ("in MyModule#test with bar = " + (bar to_s))
112
+ Console puts: "in MyModule#test with bar = #{bar}"
117
113
  end
118
114
  }
119
115
 
data/examples/test3.bt CHANGED
@@ -1,8 +1,8 @@
1
- i = (Kernel gets)
1
+ i = Console gets: "Please enter a number:"
2
2
 
3
3
  Console puts: i
4
4
 
5
- ((i to_i) < 10) if_true: {
5
+ (i to_i) < 10 if_true: {
6
6
  Console puts: "i < 10!"
7
7
  } if_false: {
8
8
  Console puts: "i > 10!!"
@@ -1,4 +1,16 @@
1
1
  Class >> :String do
2
+ def at = do |index|
3
+ %ruby{
4
+ self[index]
5
+ }%
6
+ end
7
+
8
+ def at = do |index puts: value|
9
+ %ruby{
10
+ self[index] = value
11
+ }%
12
+ end
13
+
2
14
  def substitute = do |string with: subst_string|
3
15
  self gsub: string with: subst_string
4
16
  end
data/lib/kernel/object.rb CHANGED
@@ -42,6 +42,14 @@ class Object
42
42
  end
43
43
  end
44
44
 
45
+ def and(other)
46
+ self and other
47
+ end
48
+
49
+ def or(other)
50
+ self or other
51
+ end
52
+
45
53
  # this should get called, if we try to call a method on objects of
46
54
  # ruby classes.
47
55
  # it will try to find the correct ruby method-name & clall it.
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.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Bertels