shen-ruby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/.rspec +0 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +20 -0
- data/MIT_LICENSE.txt +26 -0
- data/README.md +94 -0
- data/bin/shen_test_suite.rb +9 -0
- data/bin/srrepl +23 -0
- data/lib/kl.rb +7 -0
- data/lib/kl/absvector.rb +12 -0
- data/lib/kl/compiler.rb +253 -0
- data/lib/kl/cons.rb +51 -0
- data/lib/kl/empty_list.rb +12 -0
- data/lib/kl/environment.rb +123 -0
- data/lib/kl/error.rb +4 -0
- data/lib/kl/internal_error.rb +7 -0
- data/lib/kl/lexer.rb +186 -0
- data/lib/kl/primitives/arithmetic.rb +60 -0
- data/lib/kl/primitives/assignments.rb +18 -0
- data/lib/kl/primitives/booleans.rb +17 -0
- data/lib/kl/primitives/error_handling.rb +13 -0
- data/lib/kl/primitives/generic_functions.rb +22 -0
- data/lib/kl/primitives/lists.rb +21 -0
- data/lib/kl/primitives/streams.rb +38 -0
- data/lib/kl/primitives/strings.rb +55 -0
- data/lib/kl/primitives/symbols.rb +17 -0
- data/lib/kl/primitives/time.rb +17 -0
- data/lib/kl/primitives/vectors.rb +30 -0
- data/lib/kl/reader.rb +40 -0
- data/lib/kl/trampoline.rb +14 -0
- data/lib/shen_ruby.rb +7 -0
- data/lib/shen_ruby/version.rb +3 -0
- data/shen-ruby.gemspec +26 -0
- data/shen/README.txt +17 -0
- data/shen/lib/shen_ruby/shen.rb +124 -0
- data/shen/license.txt +34 -0
- data/shen/release/benchmarks/N_queens.shen +45 -0
- data/shen/release/benchmarks/README.shen +14 -0
- data/shen/release/benchmarks/benchmarks.shen +56 -0
- data/shen/release/benchmarks/bigprog +2173 -0
- data/shen/release/benchmarks/br.shen +13 -0
- data/shen/release/benchmarks/einstein.shen +33 -0
- data/shen/release/benchmarks/heatwave.gif +0 -0
- data/shen/release/benchmarks/interpreter.shen +219 -0
- data/shen/release/benchmarks/picture.jpg +0 -0
- data/shen/release/benchmarks/plato.jpg +0 -0
- data/shen/release/benchmarks/powerset.shen +10 -0
- data/shen/release/benchmarks/prime.shen +10 -0
- data/shen/release/benchmarks/short.shen +129 -0
- data/shen/release/benchmarks/text.txt +68 -0
- data/shen/release/k_lambda/core.kl +1002 -0
- data/shen/release/k_lambda/declarations.kl +1021 -0
- data/shen/release/k_lambda/load.kl +94 -0
- data/shen/release/k_lambda/macros.kl +479 -0
- data/shen/release/k_lambda/prolog.kl +1309 -0
- data/shen/release/k_lambda/reader.kl +1058 -0
- data/shen/release/k_lambda/sequent.kl +556 -0
- data/shen/release/k_lambda/sys.kl +582 -0
- data/shen/release/k_lambda/t-star.kl +3493 -0
- data/shen/release/k_lambda/toplevel.kl +223 -0
- data/shen/release/k_lambda/track.kl +208 -0
- data/shen/release/k_lambda/types.kl +455 -0
- data/shen/release/k_lambda/writer.kl +108 -0
- data/shen/release/k_lambda/yacc.kl +280 -0
- data/shen/release/test_programs/Chap13/problems.txt +26 -0
- data/shen/release/test_programs/README.shen +53 -0
- data/shen/release/test_programs/TinyLispFunctions.txt +16 -0
- data/shen/release/test_programs/TinyTypes.shen +55 -0
- data/shen/release/test_programs/binary.shen +24 -0
- data/shen/release/test_programs/bubble_version_1.shen +28 -0
- data/shen/release/test_programs/bubble_version_2.shen +22 -0
- data/shen/release/test_programs/calculator.shen +21 -0
- data/shen/release/test_programs/cartprod.shen +23 -0
- data/shen/release/test_programs/change.shen +25 -0
- data/shen/release/test_programs/classes-defaults.shen +94 -0
- data/shen/release/test_programs/classes-inheritance.shen +100 -0
- data/shen/release/test_programs/classes-typed.shen +74 -0
- data/shen/release/test_programs/classes-untyped.shen +46 -0
- data/shen/release/test_programs/depth_.shen +14 -0
- data/shen/release/test_programs/einstein.shen +33 -0
- data/shen/release/test_programs/fruit_machine.shen +46 -0
- data/shen/release/test_programs/interpreter.shen +219 -0
- data/shen/release/test_programs/metaprog.shen +85 -0
- data/shen/release/test_programs/minim.shen +193 -0
- data/shen/release/test_programs/mutual.shen +11 -0
- data/shen/release/test_programs/n_queens.shen +45 -0
- data/shen/release/test_programs/newton_version_1.shen +33 -0
- data/shen/release/test_programs/newton_version_2.shen +24 -0
- data/shen/release/test_programs/parse.prl +14 -0
- data/shen/release/test_programs/parser.shen +52 -0
- data/shen/release/test_programs/powerset.shen +10 -0
- data/shen/release/test_programs/prime.shen +10 -0
- data/shen/release/test_programs/proof_assistant.shen +81 -0
- data/shen/release/test_programs/proplog_version_1.shen +25 -0
- data/shen/release/test_programs/proplog_version_2.shen +27 -0
- data/shen/release/test_programs/qmachine.shen +67 -0
- data/shen/release/test_programs/red-black.shen +55 -0
- data/shen/release/test_programs/search.shen +56 -0
- data/shen/release/test_programs/semantic_net.shen +44 -0
- data/shen/release/test_programs/spreadsheet.shen +35 -0
- data/shen/release/test_programs/stack.shen +27 -0
- data/shen/release/test_programs/streams.shen +20 -0
- data/shen/release/test_programs/strings.shen +59 -0
- data/shen/release/test_programs/structures-typed.shen +71 -0
- data/shen/release/test_programs/structures-untyped.shen +42 -0
- data/shen/release/test_programs/tests.shen +294 -0
- data/shen/release/test_programs/types.shen +11 -0
- data/shen/release/test_programs/whist.shen +240 -0
- data/shen/release/test_programs/yacc.shen +136 -0
- data/spec/kl/cons_spec.rb +12 -0
- data/spec/kl/environment_spec.rb +306 -0
- data/spec/kl/lexer_spec.rb +149 -0
- data/spec/kl/primitives/generic_functions_spec.rb +29 -0
- data/spec/kl/primitives/symbols_spec.rb +21 -0
- data/spec/kl/reader_spec.rb +36 -0
- data/spec/spec_helper.rb +2 -0
- metadata +189 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
module Assignments
|
4
|
+
def set(sym, value)
|
5
|
+
@variables[sym] = value
|
6
|
+
value
|
7
|
+
end
|
8
|
+
|
9
|
+
def value(sym)
|
10
|
+
if @variables.has_key?(sym)
|
11
|
+
@variables[sym]
|
12
|
+
else
|
13
|
+
raise Kl::Error, "variable #{sym} has no value"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
# The boolean functions are all implemented as short-circuiting special
|
4
|
+
# forms in the compiler. The implementations below are for use as
|
5
|
+
# arguments to higher-order functions. They are used, e.g., in the
|
6
|
+
# Quantifier Machine test case in the Shen Test Suite.
|
7
|
+
module Booleans
|
8
|
+
def or(a, b)
|
9
|
+
a || b
|
10
|
+
end
|
11
|
+
|
12
|
+
def and(a, b)
|
13
|
+
a && b
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
# The following functions are implemented as special forms
|
4
|
+
# in Kl::Compiler:
|
5
|
+
#
|
6
|
+
# - defun
|
7
|
+
# - lambda
|
8
|
+
# - let
|
9
|
+
# - freeze
|
10
|
+
# - type
|
11
|
+
module GenericFunctions
|
12
|
+
define_method '=' do |a, b|
|
13
|
+
a == b
|
14
|
+
end
|
15
|
+
|
16
|
+
# Curried after inclusion
|
17
|
+
define_method 'eval-kl' do |exp|
|
18
|
+
__eval(exp)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
module Streams
|
4
|
+
def pr(s, stream)
|
5
|
+
if stream == STDIN
|
6
|
+
# shen-prbytes in toplevel.kl calls pr on *stinput* rather than
|
7
|
+
# *stoutput*. As a temporary solution, use the same approach
|
8
|
+
# that Bruno Deferrari uses in his Scheme port. See
|
9
|
+
# https://groups.google.com/d/topic/qilang/2ixosqX4Too/discussion
|
10
|
+
stream = STDOUT if stream == STDIN
|
11
|
+
end
|
12
|
+
stream.write(s)
|
13
|
+
s
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method 'read-byte' do |stream|
|
17
|
+
if stream.eof?
|
18
|
+
-1
|
19
|
+
else
|
20
|
+
stream.readbyte
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def open(stream_type, name, direction)
|
25
|
+
unless stream_type == :file
|
26
|
+
raise Kl::Error, "unsupported stream type: #{stream_type}"
|
27
|
+
end
|
28
|
+
File.open(File.expand_path(name, value(:'*home-directory*')),
|
29
|
+
direction == :out ? 'w' : 'r')
|
30
|
+
end
|
31
|
+
|
32
|
+
def close(stream)
|
33
|
+
stream.close
|
34
|
+
:NIL
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
# For the time being, Shen Ruby's string functions only support 8-bit
|
4
|
+
# characters. Once the Shen environment is up and running and passing
|
5
|
+
# its test suite, strings will be extended to support UTF-8.
|
6
|
+
module Strings
|
7
|
+
def pos(s, n)
|
8
|
+
s.byteslice(n)
|
9
|
+
end
|
10
|
+
|
11
|
+
def tlstr(s)
|
12
|
+
if s.empty?
|
13
|
+
:"shen-eos"
|
14
|
+
else
|
15
|
+
s.byteslice(1, s.bytesize - 1)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def cn(s1, s2)
|
20
|
+
s1 + s2
|
21
|
+
end
|
22
|
+
|
23
|
+
def str(x)
|
24
|
+
case x
|
25
|
+
when String
|
26
|
+
'"' + x + '"'
|
27
|
+
when Symbol
|
28
|
+
x.to_s
|
29
|
+
when Numeric
|
30
|
+
x.to_s
|
31
|
+
when TrueClass, FalseClass
|
32
|
+
x.to_s
|
33
|
+
when Proc
|
34
|
+
x.to_s
|
35
|
+
when IO
|
36
|
+
x.to_s
|
37
|
+
else
|
38
|
+
raise Kl::Error, "str applied to non-atomic type: #{x.class}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def string?(x)
|
43
|
+
x.kind_of? String
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method 'n->string' do |n|
|
47
|
+
"" << n
|
48
|
+
end
|
49
|
+
|
50
|
+
define_method 'string->n' do |s|
|
51
|
+
s.bytes.to_a.first
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
module Symbols
|
4
|
+
def intern(str)
|
5
|
+
# 'true' and 'false' are treated specially and return the
|
6
|
+
# corresponding booleans
|
7
|
+
if str == 'true'
|
8
|
+
true
|
9
|
+
elsif str == 'false'
|
10
|
+
false
|
11
|
+
else
|
12
|
+
str.to_sym
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
module Time
|
4
|
+
define_method 'get-time' do |time_type|
|
5
|
+
case time_type
|
6
|
+
when :run, :real
|
7
|
+
::Time.now.to_f
|
8
|
+
when :unix
|
9
|
+
::Time.now.to_i
|
10
|
+
else
|
11
|
+
raise Kl::Error, "unsupported time type: #{time_type}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Kl
|
2
|
+
module Primitives
|
3
|
+
module Vectors
|
4
|
+
def absvector(n)
|
5
|
+
Kl::Absvector.new(n)
|
6
|
+
end
|
7
|
+
|
8
|
+
define_method 'address->' do |v, n, value|
|
9
|
+
if n < 0 || n >= v.upper_limit
|
10
|
+
raise Kl::Error, "out of bounds"
|
11
|
+
end
|
12
|
+
|
13
|
+
v[n] = value
|
14
|
+
v
|
15
|
+
end
|
16
|
+
|
17
|
+
define_method '<-address' do |v, n|
|
18
|
+
if n < 0 || n >= v.upper_limit
|
19
|
+
raise Kl::Error, "out of bounds"
|
20
|
+
end
|
21
|
+
|
22
|
+
v[n]
|
23
|
+
end
|
24
|
+
|
25
|
+
def absvector?(v)
|
26
|
+
v.kind_of? Kl::Absvector
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/kl/reader.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'kl/lexer'
|
2
|
+
|
3
|
+
module Kl
|
4
|
+
class Reader
|
5
|
+
def initialize(stream)
|
6
|
+
@lexer = Kl::Lexer.new(stream)
|
7
|
+
end
|
8
|
+
|
9
|
+
def next
|
10
|
+
token = @lexer.next
|
11
|
+
unless token.nil?
|
12
|
+
if token.kind_of? Kl::Lexer::OpenParen
|
13
|
+
read_list
|
14
|
+
else
|
15
|
+
token
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def read_list
|
23
|
+
items = []
|
24
|
+
|
25
|
+
loop do
|
26
|
+
token = @lexer.next
|
27
|
+
raise Kl::Error, 'Unterminated list' if token.nil?
|
28
|
+
case token
|
29
|
+
when Kl::Lexer::OpenParen
|
30
|
+
items << read_list
|
31
|
+
when Kl::Lexer::CloseParen
|
32
|
+
break
|
33
|
+
else
|
34
|
+
items << token
|
35
|
+
end
|
36
|
+
end
|
37
|
+
Kl::Cons.list(items)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Kl
|
2
|
+
# Trampolines hold a function and a list of its already-evaluated
|
3
|
+
# arguments. They are used to keep the strack from growing on
|
4
|
+
# tail calls.
|
5
|
+
class Trampoline
|
6
|
+
attr_reader :fn, :args, :f
|
7
|
+
|
8
|
+
def initialize(fn, args, f)
|
9
|
+
@fn = fn
|
10
|
+
@args = args
|
11
|
+
@f = f
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/shen_ruby.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'kl'
|
2
|
+
require 'shen_ruby/version'
|
3
|
+
|
4
|
+
# The following file is a derivative of the Shen release packages with ShenRuby
|
5
|
+
# and it located under the shen directory hierarchy to make the license
|
6
|
+
# unambigous. It can be found at shen/lib/shen_ruby/shen.rb
|
7
|
+
require 'shen_ruby/shen'
|
data/shen-ruby.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
lib = File.expand_path('../lib/', __FILE__)
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
require 'shen_ruby/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "shen-ruby"
|
8
|
+
s.version = ShenRuby::VERSION
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.license = "Shen License and MIT License. See README.md for details."
|
11
|
+
s.authors = ["Greg Spurrier", "Mark Tarver"]
|
12
|
+
s.email = ["greg@sourcematters.org"]
|
13
|
+
s.homepage = "https://github.com/gregspurrier/shen-ruby"
|
14
|
+
s.summary = %q{ShenRuby is a Ruby port of the Shen programming language}
|
15
|
+
s.description = %q{ShenRuby is a port of the Shen programming language to Ruby. It currently supports Shen version 7.1.}
|
16
|
+
|
17
|
+
s.required_ruby_version = ">= 1.9.3"
|
18
|
+
|
19
|
+
s.add_development_dependency "rspec", "~> 2.12"
|
20
|
+
|
21
|
+
git_files = `git ls-files`.split("\n") rescue ''
|
22
|
+
s.files = git_files
|
23
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
s.executables = %w(srrepl)
|
25
|
+
s.require_paths = ["lib", "shen/lib"]
|
26
|
+
end
|
data/shen/README.txt
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
The files found in this directory and its subdirectories are part of
|
2
|
+
Shen and are subject to the Shen License. A copy of the license may be
|
3
|
+
found in license.txt in this directory. A detailed explanation of the
|
4
|
+
license may be found at http://shenlanguage.org/license.html.
|
5
|
+
|
6
|
+
Directory contents:
|
7
|
+
|
8
|
+
README.txt -- this file
|
9
|
+
license.txt -- the Shen license
|
10
|
+
release/ -- files extracted directly from the Shen 7.1 Source
|
11
|
+
release. The complete source for the most recent
|
12
|
+
release of Shen may be downloaded from
|
13
|
+
http://www.shenlanguage.org/Download/index.htm
|
14
|
+
lib/ -- Ruby code that creates a full Shen environment running
|
15
|
+
under ShenRuby's implementation of K Lambda. This code
|
16
|
+
is considered a derivative work of the original Shen
|
17
|
+
Source release.
|
@@ -0,0 +1,124 @@
|
|
1
|
+
############################################################################
|
2
|
+
# License
|
3
|
+
# -------
|
4
|
+
# The user is free to produce commercial applications with the
|
5
|
+
# software, to distribute these applications in source or binary form,
|
6
|
+
# and to charge monies for them as he sees fit and in concordance with
|
7
|
+
# the laws of the land subject to the following license.
|
8
|
+
#
|
9
|
+
# 1. The license applies to all the software and all derived software
|
10
|
+
# and must appear on such.
|
11
|
+
#
|
12
|
+
# 2. It is illegal to distribute the software without this license
|
13
|
+
# attached to it and use of the software implies agreement with the
|
14
|
+
# license as such. It is illegal for anyone who is not the copyright
|
15
|
+
# holder to tamper with or change the license.
|
16
|
+
#
|
17
|
+
# 3. Neither the names of Lambda Associates or the copyright holder
|
18
|
+
# may be used to endorse or promote products built using the software
|
19
|
+
# without specific prior written permission from the copyright holder.
|
20
|
+
#
|
21
|
+
# 4. That possession of this license does not confer on the copyright
|
22
|
+
# holder any special contractual obligation towards the user. That in
|
23
|
+
# no event shall the copyright holder be liable for any direct,
|
24
|
+
# indirect, incidental, special, exemplary or consequential damages
|
25
|
+
# (including but not limited to procurement of substitute goods or
|
26
|
+
# services, loss of use, data, or profits; or business interruption),
|
27
|
+
# however caused and on any theory of liability, whether in contract,
|
28
|
+
# strict liability or tort (including negligence) arising in any way
|
29
|
+
# out of the use of the software, even if advised of the possibility
|
30
|
+
# of such damage.
|
31
|
+
#
|
32
|
+
# 5. It is permitted for the user to change the software, for the
|
33
|
+
# purpose of improving performance, correcting an error, or porting to
|
34
|
+
# a new platform, and distribute the modified version of Shen
|
35
|
+
# (hereafter the modified version) provided the resulting program
|
36
|
+
# conforms in all respects to the Shen standard and is issued under
|
37
|
+
# that title. The user must make it clear with his distribution that
|
38
|
+
# he/she is the author of the changes and what these changes are and
|
39
|
+
# why.
|
40
|
+
#
|
41
|
+
# 6. Derived versions of this software in whatever form are subject to
|
42
|
+
# the same restrictions. In particular it is not permitted to make
|
43
|
+
# derived copies of this software which do not conform to the Shen
|
44
|
+
# standard or appear under a different title.
|
45
|
+
#
|
46
|
+
# 7. It is permitted to distribute versions of Shen which incorporate
|
47
|
+
# libraries, graphics or other facilities which are not part of the
|
48
|
+
# Shen standard.
|
49
|
+
#
|
50
|
+
# For an explication of this license see
|
51
|
+
# http://www.lambdassociates.org/News/june11/license.htm which
|
52
|
+
# explains this license in full.
|
53
|
+
#
|
54
|
+
############################################################################
|
55
|
+
#
|
56
|
+
# This file was written by Greg Spurrier as part of the ShenRuby
|
57
|
+
# project. It is essentially a shell into which the K Lambda sources
|
58
|
+
# of Shen are loaded at runtime as part of object initialization to
|
59
|
+
# produce a working Shen environment. It is thefore a derivative work
|
60
|
+
# of the Shen sources and is subject to the Shen License.
|
61
|
+
#
|
62
|
+
############################################################################
|
63
|
+
|
64
|
+
module ShenRuby
|
65
|
+
# Instances of the ShenRuby::Shen class provide a Shen environment
|
66
|
+
# running within ShenRuby's K Lambda implementation.
|
67
|
+
class Shen < Kl::Environment
|
68
|
+
def initialize
|
69
|
+
super
|
70
|
+
|
71
|
+
# Set the global variables
|
72
|
+
set("*language*".to_sym, "Ruby")
|
73
|
+
set("*implementation*".to_sym, "#{RUBY_ENGINE} #{RUBY_VERSION}")
|
74
|
+
set("*release*".to_sym, RUBY_VERSION)
|
75
|
+
set("*port*".to_sym, ShenRuby::VERSION)
|
76
|
+
set("*porters*".to_sym, "Greg Spurrier")
|
77
|
+
set("*home-directory*".to_sym, Dir.pwd)
|
78
|
+
set("*stinput*".to_sym, STDIN)
|
79
|
+
set("*stoutput*".to_sym, STDOUT)
|
80
|
+
|
81
|
+
|
82
|
+
# Load the K Lambda files
|
83
|
+
kl_root = File.expand_path('../../../release/k_lambda', __FILE__)
|
84
|
+
%w(toplevel core sys).each do |kl_filename|
|
85
|
+
Kl::Environment.load_file(self, File.join(kl_root, kl_filename + ".kl"))
|
86
|
+
end
|
87
|
+
|
88
|
+
# Overrides
|
89
|
+
class << self
|
90
|
+
# Kl::Absvector.new already initializes every element, so we can
|
91
|
+
# use a simpler version of vector
|
92
|
+
def vector(n)
|
93
|
+
v = ::Kl::Absvector.new(n + 1) #, fail)
|
94
|
+
v[0] = n
|
95
|
+
v
|
96
|
+
end
|
97
|
+
|
98
|
+
# The version of shen-explode-string from sys.kl is not tail-recursive.
|
99
|
+
# Replace it with a version that does not blow up the stack.
|
100
|
+
define_method "shen-explode-string" do |str|
|
101
|
+
Kl::Cons.list(str.split(//))
|
102
|
+
end
|
103
|
+
|
104
|
+
# Give a way to bail out
|
105
|
+
define_method 'quit' do
|
106
|
+
::Kernel.exit(0)
|
107
|
+
end
|
108
|
+
|
109
|
+
# For debugging the compiler
|
110
|
+
define_method 'set-dump-code' do |val|
|
111
|
+
@dump_code = val
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Load the rest of the K Lambda files
|
116
|
+
%w(sequent yacc
|
117
|
+
reader prolog track load writer
|
118
|
+
macros declarations t-star types
|
119
|
+
).each do |kl_filename|
|
120
|
+
Kl::Environment.load_file(self, File.join(kl_root, kl_filename + ".kl"))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|