halunke 0.5.3 → 0.6.0
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/docs/_layouts/default.html +22 -1
- data/docs/array.md +12 -0
- data/docs/dictionary.md +20 -0
- data/docs/regexp.md +12 -0
- data/docs/string.md +37 -2
- data/lib/halunke/runtime/harray.rb +3 -0
- data/lib/halunke/runtime/hdictionary.rb +8 -1
- data/lib/halunke/runtime/hregexp.rb +4 -1
- data/lib/halunke/runtime/hstring.rb +11 -0
- data/lib/halunke/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 587cfa31e2be95b2b47f3bc8b37f2a749fccdd68
|
4
|
+
data.tar.gz: c6365eaadd5898b4eb3be920b0da777bf72e7963
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4f24894837424828d9497f1f7051dcd3a821b0fb1000a8f7595910b50f431954459adc86a7aaedf4df8958d82b7eaeda5163fbeff1d604d754e6f0f693b8eb1
|
7
|
+
data.tar.gz: 00be7897906fa849398cede10df3b32a5e136857274e465733fbdd276c7750f5ddf63d0d11f4651de2dcc9dcc57e64d86937f63968b0d86bbe4a2c33e00e54e1
|
data/Gemfile.lock
CHANGED
data/docs/_layouts/default.html
CHANGED
@@ -31,6 +31,9 @@
|
|
31
31
|
<li class="nav-item">
|
32
32
|
<a class="nav-link" href="/dictionary">Dictionary</a>
|
33
33
|
</li>
|
34
|
+
<li class="nav-item">
|
35
|
+
<a class="nav-link" href="/regexp">Regexp</a>
|
36
|
+
</li>
|
34
37
|
<li class="nav-item">
|
35
38
|
<a class="nav-link" href="/true-false">True & False</a>
|
36
39
|
</li>
|
@@ -52,17 +55,35 @@
|
|
52
55
|
|
53
56
|
<header>
|
54
57
|
<div class="alert alert-primary" role="alert">
|
55
|
-
Halunke is Open Source and on <a href="http://github.com/moonglum/halunke">Github. <a href="
|
58
|
+
Halunke is Open Source and on <a href="http://github.com/moonglum/halunke">Github. <a href="#repl">Try out Halunke online!</a>
|
56
59
|
</div>
|
57
60
|
<h1>{{ page.title }}</h1>
|
58
61
|
</header>
|
59
62
|
<main>
|
60
63
|
{{ content }}
|
61
64
|
</main>
|
65
|
+
<footer>
|
66
|
+
<h2 id="repl">Try Halunke in your browser</h2>
|
67
|
+
<a href="https://try.halunke.jetzt/repl" onclick="javascript:launch_repl(this); return false;">Click here to start an interactive Halunke Shell.</a>
|
68
|
+
You can also go to <a target="_blank" href="https://try.halunke.jetzt/repl">try.halunke.jetzt</a> to directly open the REPL.
|
69
|
+
<div id="try-frame-target"></div>
|
70
|
+
</footer>
|
62
71
|
</div>
|
63
72
|
|
64
73
|
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
|
65
74
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
|
66
75
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
|
76
|
+
<script>
|
77
|
+
var launch_repl = function(element) {
|
78
|
+
var iframe = document.createElement('iframe');
|
79
|
+
var wrapper = document.querySelectorAll('#try-frame-target');
|
80
|
+
iframe.src = element.getAttribute('href');
|
81
|
+
iframe.id = 'try-frame';
|
82
|
+
iframe.style = 'width: 100%; border: 2px solid #f3f3f3; position: sticky; height: 200px; margin-top: 10px; bottom: 0; left: 0; right: 0; box-shadow: 0 -3px 6px 0px #888888';
|
83
|
+
iframe.scrolling = 'no';
|
84
|
+
element.remove();
|
85
|
+
wrapper[0].replaceWith(iframe);
|
86
|
+
};
|
87
|
+
</script>
|
67
88
|
</body>
|
68
89
|
</html>
|
data/docs/array.md
CHANGED
@@ -17,6 +17,18 @@ whitespace.
|
|
17
17
|
|
18
18
|
It can answer to the following messages:
|
19
19
|
|
20
|
+
## `@ else`
|
21
|
+
|
22
|
+
Looks up a value in the Array by index. If the index is out of
|
23
|
+
bounds for the array, return the fallback value
|
24
|
+
|
25
|
+
**Example:**
|
26
|
+
|
27
|
+
```
|
28
|
+
([2 3 4] @ 1 else "NOT FOUND") /* => 3 */
|
29
|
+
([2 3 4] @ 3 else "NOT FOUND") /* => "NOT FOUND" */
|
30
|
+
```
|
31
|
+
|
20
32
|
## `=`
|
21
33
|
|
22
34
|
Compares to arrays. If they have the same length and each item from
|
data/docs/dictionary.md
CHANGED
@@ -13,6 +13,14 @@ written in square brackets, prefixed with an `@`.
|
|
13
13
|
@["a" 1 "b" 2]
|
14
14
|
```
|
15
15
|
|
16
|
+
It has an alternative constructor to construct it from an array of
|
17
|
+
two element arrays:
|
18
|
+
|
19
|
+
```
|
20
|
+
(Dictionary from [["a" 1] ["b" 2]])
|
21
|
+
/* => @["a" 1 "b" 2] */
|
22
|
+
```
|
23
|
+
|
16
24
|
It can answer to the following message:
|
17
25
|
|
18
26
|
## `@ else`
|
@@ -27,6 +35,18 @@ dictionary, the fallback value is used.
|
|
27
35
|
(@["a" 1 "b" 2] @ "c" else "Not Found") /* => "Not Found" */
|
28
36
|
```
|
29
37
|
|
38
|
+
## `merge`
|
39
|
+
|
40
|
+
Returns a new dictionary that is this dictionary merged with
|
41
|
+
another dictionary.
|
42
|
+
|
43
|
+
**Example:**
|
44
|
+
|
45
|
+
```
|
46
|
+
(@["a" 1 "b" 2] merge @["c" 3])
|
47
|
+
/* => @["a" 1 "b" 2 "c" 3] */
|
48
|
+
```
|
49
|
+
|
30
50
|
## `to_s`
|
31
51
|
|
32
52
|
This returns a string to represent the dictionary in output.
|
data/docs/regexp.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
title: Regexp
|
3
|
+
---
|
4
|
+
|
5
|
+
Regexp is a regular expression. It can be created like this:
|
6
|
+
|
7
|
+
```
|
8
|
+
(Regexp from "a+")
|
9
|
+
```
|
10
|
+
|
11
|
+
Currently it doesn't answer to any messages except `inspect` and `to_s`. To use
|
12
|
+
a Regexp, see the messages you can send to [String](/string).
|
data/docs/string.md
CHANGED
@@ -24,12 +24,47 @@ Return a reversed version of the String.
|
|
24
24
|
|
25
25
|
## `replace with`
|
26
26
|
|
27
|
-
Replace all occurrences of the first string with the second string.
|
27
|
+
Replace all occurrences of the first string with the second string. You can
|
28
|
+
also provide a Regexp as the first argument. You can then use backreferences in
|
29
|
+
the `with` String: The entire match can be referenced by `\0`, the first group
|
30
|
+
by `\1` etc,
|
28
31
|
|
29
|
-
**
|
32
|
+
**Examples:**
|
30
33
|
|
31
34
|
```
|
32
35
|
("ababab" replace "a" with "c") /* => "cbcbcb" */
|
36
|
+
|
37
|
+
("ababab" replace (Regexp from "(a)") with "<\1>")
|
38
|
+
/* => "<a>b<a>b<a>b" */
|
39
|
+
```
|
40
|
+
|
41
|
+
## `scan`
|
42
|
+
|
43
|
+
Find all occurrences of the given Regex. Returns an Array. If it doesn't
|
44
|
+
include any groups, it contains Strings. If it contains groups, then it
|
45
|
+
contains arrays of strings.
|
46
|
+
|
47
|
+
```
|
48
|
+
('result = ("aaabaac" scan (Regexp from "a+")))
|
49
|
+
(result @ 0 else "NOT FOUND") /* => "aaa" */
|
50
|
+
```
|
51
|
+
|
52
|
+
## `match`
|
53
|
+
|
54
|
+
This matches a Regexp over a String an collects the results in a Dictionary.
|
55
|
+
The entire match is available under the key 0. Every named match can be
|
56
|
+
referenced by its position starting from 1. And all named matches can be
|
57
|
+
referenced by their name and their position.
|
58
|
+
|
59
|
+
```
|
60
|
+
('regexp = (Regexp from "(?<foo>a+)b(?<bar>c+)"))
|
61
|
+
('match = ("aaaabcc" match regexp))
|
62
|
+
|
63
|
+
(match @ 0 else "NOT FOUND") /* => "aaaabcc" */
|
64
|
+
(match @ 1 else "NOT FOUND") /* => "aaaa" */
|
65
|
+
(match @ 2 else "NOT FOUND") /* => "cc" */
|
66
|
+
(match @ "foo" else "NOT FOUND") /* => "aaaa" */
|
67
|
+
(match @ "bar" else "NOT FOUND") /* => "cc" */
|
33
68
|
```
|
34
69
|
|
35
70
|
## `=`
|
@@ -13,6 +13,9 @@ module Halunke
|
|
13
13
|
memo.receive_message(context, "and", [value])
|
14
14
|
end
|
15
15
|
}),
|
16
|
+
"@ else" => HFunction.new([:self, :index, :fallback], lambda { |context|
|
17
|
+
context["self"].ruby_value[context["index"].ruby_value] || context["fallback"]
|
18
|
+
}),
|
16
19
|
"map" => HFunction.new([:self, :fn], lambda { |context|
|
17
20
|
return HArray.create_instance(context["self"].ruby_value.map do |x|
|
18
21
|
context["fn"].receive_message(context, "call", [HArray.create_instance([x])])
|
@@ -10,6 +10,9 @@ module Halunke
|
|
10
10
|
end
|
11
11
|
result ? result[1] : context["fallback"]
|
12
12
|
}),
|
13
|
+
"merge" => HFunction.new([:self, :other], lambda { |context|
|
14
|
+
HDictionary.create_instance(context["self"].ruby_value.merge(context["other"].ruby_value))
|
15
|
+
}),
|
13
16
|
"to_s" => HFunction.new([:self], lambda { |context|
|
14
17
|
x = []
|
15
18
|
context["self"].ruby_value.each_pair do |key, value|
|
@@ -28,7 +31,11 @@ module Halunke
|
|
28
31
|
HString.create_instance("@[#{x.join(' ')}]")
|
29
32
|
})
|
30
33
|
},
|
31
|
-
{
|
34
|
+
{
|
35
|
+
"from" => HFunction.new([:self, :array], lambda { |context|
|
36
|
+
context["self"].create_instance(context["array"].ruby_value.map(&:ruby_value).to_h)
|
37
|
+
})
|
38
|
+
},
|
32
39
|
true
|
33
40
|
)
|
34
41
|
end
|
@@ -4,7 +4,10 @@ module Halunke
|
|
4
4
|
"Regexp",
|
5
5
|
[],
|
6
6
|
{
|
7
|
-
"
|
7
|
+
"to_s" => HFunction.new([:self], lambda { |context|
|
8
|
+
HString.create_instance(context["self"].ruby_value.inspect)
|
9
|
+
}),
|
10
|
+
"inspect" => HFunction.new([:self], lambda { |context|
|
8
11
|
HString.create_instance(context["self"].ruby_value.inspect)
|
9
12
|
})
|
10
13
|
},
|
@@ -27,6 +27,17 @@ module Halunke
|
|
27
27
|
end
|
28
28
|
HDictionary.create_instance(h)
|
29
29
|
}),
|
30
|
+
"scan" => HFunction.new([:self, :regexp], lambda { |context|
|
31
|
+
result = context["self"].ruby_value.scan(context["regexp"].ruby_value)
|
32
|
+
|
33
|
+
HArray.create_instance(result.map do |r|
|
34
|
+
if r.class == Array
|
35
|
+
HArray.create_instance(r.map { |x| HString.create_instance(x) })
|
36
|
+
else
|
37
|
+
HString.create_instance(r)
|
38
|
+
end
|
39
|
+
end)
|
40
|
+
}),
|
30
41
|
"=" => HFunction.new([:self, :other], lambda { |context|
|
31
42
|
if context["self"].ruby_value == context["other"].ruby_value
|
32
43
|
context["true"]
|
data/lib/halunke/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: halunke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lucas Dohmen
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- docs/function.md
|
113
113
|
- docs/index.md
|
114
114
|
- docs/number.md
|
115
|
+
- docs/regexp.md
|
115
116
|
- docs/stdio.md
|
116
117
|
- docs/string.md
|
117
118
|
- docs/true-false.md
|