conflisp 1.0.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 +7 -0
- data/lib/conflisp.rb +3 -0
- data/lib/conflisp/conflisp_error.rb +5 -0
- data/lib/conflisp/dsl.rb +23 -0
- data/lib/conflisp/evaluator.rb +48 -0
- data/lib/conflisp/language.rb +30 -0
- data/lib/conflisp/method_missing.rb +7 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 34e85b7514e76a0fb5709c69c5cafaa87cdd42be254f708acf48564e30ea4712
|
4
|
+
data.tar.gz: 6d39a6a091b1e2e8de18f875efcdea4b14d19c686ea2c626bb1f67a032f0824c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3bdaf8b254d7c0deeb2ba60e5e81bcc9718f5382e726bc4396655378fddfe38f5ba674549dcc3d54fcade64bef81acc4ef634f983ee648e00c93219026225bd3
|
7
|
+
data.tar.gz: 9faf45a09a04e50e634e5ba5ce2556931c82ea5487d43e530ad8fec0d3fc317540411dfbc8dbcdc3e2e669e2c223ddd420ad90c1d7c18adf86757785a6ed91f4
|
data/lib/conflisp.rb
ADDED
data/lib/conflisp/dsl.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Conflisp
|
4
|
+
# A nice helper DSL for building up Conflisp languages
|
5
|
+
class DSL
|
6
|
+
attr_reader :registry
|
7
|
+
|
8
|
+
def self.define(&block)
|
9
|
+
registry = {}
|
10
|
+
dsl = new(registry: registry)
|
11
|
+
dsl.instance_exec(&block)
|
12
|
+
registry
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(registry:)
|
16
|
+
@registry = registry
|
17
|
+
end
|
18
|
+
|
19
|
+
def fn(name, implementation)
|
20
|
+
registry[name.to_s] = implementation
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'conflisp/method_missing'
|
4
|
+
|
5
|
+
module Conflisp
|
6
|
+
# Evaluator takes s-expressions and resolves them into Ruby values
|
7
|
+
class Evaluator
|
8
|
+
attr_reader :registry, :globals
|
9
|
+
|
10
|
+
def initialize(registry:, globals:)
|
11
|
+
@registry = registry
|
12
|
+
@globals = globals
|
13
|
+
end
|
14
|
+
|
15
|
+
def resolve(expression) # rubocop:disable Metrics/MethodLength
|
16
|
+
case expression
|
17
|
+
when Array
|
18
|
+
# In Lisp, Arrays are function calls
|
19
|
+
fn, *raw_args = expression
|
20
|
+
fn = fn.to_s
|
21
|
+
args = raw_args.map { |arg| resolve(arg) }
|
22
|
+
if fn == 'global'
|
23
|
+
globals.dig(*args)
|
24
|
+
elsif fn_defined?(fn)
|
25
|
+
apply(fn, *args)
|
26
|
+
else
|
27
|
+
# TODO: It would be nice to get error messages with a stacktrace or at
|
28
|
+
# least some context about the parent expressions
|
29
|
+
raise MethodMissing, "Unknown fn #{fn} in expression #{expression}"
|
30
|
+
end
|
31
|
+
when Hash
|
32
|
+
expression.transform_values do |value|
|
33
|
+
resolve(value)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
expression
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def fn_defined?(fn_name)
|
41
|
+
registry.key?(fn_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def apply(fn_name, *args)
|
45
|
+
instance_exec(*args, ®istry[fn_name])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'conflisp/dsl'
|
4
|
+
require 'conflisp/evaluator'
|
5
|
+
|
6
|
+
module Conflisp
|
7
|
+
# A collection of functions that can evaluate JSON encoded s-expressions
|
8
|
+
class Language
|
9
|
+
attr_reader :registry
|
10
|
+
|
11
|
+
def self.define(&block)
|
12
|
+
method_registry = DSL.define(&block)
|
13
|
+
new(registry: method_registry)
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(registry:)
|
17
|
+
@registry = registry
|
18
|
+
end
|
19
|
+
|
20
|
+
def evaluate(expression, globals: {})
|
21
|
+
evaluator = Evaluator.new(registry: registry, globals: globals)
|
22
|
+
evaluator.resolve(expression)
|
23
|
+
end
|
24
|
+
|
25
|
+
def extend(&block)
|
26
|
+
new_registry = DSL.define(&block)
|
27
|
+
self.class.new(registry: registry.merge(new_registry))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: conflisp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rocky Meza
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-06-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.7.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.7.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec_junit_formatter
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.4.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.4.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.71.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.71.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.16.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.16.1
|
69
|
+
description:
|
70
|
+
email:
|
71
|
+
- rocky@geteverwise.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/conflisp.rb
|
77
|
+
- lib/conflisp/conflisp_error.rb
|
78
|
+
- lib/conflisp/dsl.rb
|
79
|
+
- lib/conflisp/evaluator.rb
|
80
|
+
- lib/conflisp/language.rb
|
81
|
+
- lib/conflisp/method_missing.rb
|
82
|
+
homepage: https://github.com/everwise/conflisp
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubygems_version: 3.0.3
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: A tool for building JSON-serializable lisps.
|
105
|
+
test_files: []
|