cycr 0.0.3 → 0.0.4
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/cycr.gemspec +2 -2
- data/lib/cycr/builder.rb +33 -0
- data/lib/cycr/client.rb +8 -56
- data/lib/cycr/extensions.rb +6 -8
- data/lib/cycr/sexpr.rex +7 -7
- data/lib/cycr/sexpr.rex.rb +9 -9
- data/spec/client.rb +0 -7
- metadata +5 -5
- data/lib/cycr/nart.rb +0 -21
data/cycr.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cycr"
|
3
|
-
s.version = "0.0.
|
3
|
+
s.version = "0.0.4"
|
4
4
|
s.date = "2010-10-19"
|
5
5
|
s.summary = "Ruby client for the (Open)Cyc server"
|
6
6
|
s.email = "apohllo@o2.pl"
|
7
|
-
s.homepage = "http://
|
7
|
+
s.homepage = "http://github.com/apohllo/cycr"
|
8
8
|
s.require_path = "lib"
|
9
9
|
s.description = "Ruby wrapper for (Open)Cyc server and ontology"
|
10
10
|
s.has_rdoc = false
|
data/lib/cycr/builder.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Cyc
|
2
|
+
# Author:: Aleksander Pohl (mailto:apohllo@o2.pl)
|
3
|
+
# License:: MIT License
|
4
|
+
#
|
5
|
+
# This class is used to capture calls to the Cyc client, to allow
|
6
|
+
# nested calls, like
|
7
|
+
#
|
8
|
+
# cyc.with_any_mt do
|
9
|
+
# comment :Collection
|
10
|
+
# end
|
11
|
+
class Builder
|
12
|
+
def initialize
|
13
|
+
reset
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset
|
17
|
+
@query = ""
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_cyc
|
21
|
+
@query
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(name,*args,&block)
|
25
|
+
@query << "(" << name.to_s.gsub("_","-") << " "
|
26
|
+
@query << args.map{|a| a.to_cyc}.join(" ")
|
27
|
+
if block
|
28
|
+
self.instance_exec(&block)
|
29
|
+
end
|
30
|
+
@query << ")"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/cycr/client.rb
CHANGED
@@ -18,6 +18,7 @@ module Cyc
|
|
18
18
|
@pid = Process.pid
|
19
19
|
@parser = Parser.new
|
20
20
|
@mts_cache = {}
|
21
|
+
@builder = Builder.new
|
21
22
|
|
22
23
|
# read domains mapings
|
23
24
|
# talk(File.read(File.join(
|
@@ -75,27 +76,9 @@ module Cyc
|
|
75
76
|
@conn = nil
|
76
77
|
end
|
77
78
|
|
78
|
-
NART_QUERY =<<-END
|
79
|
-
(clet ((result ())
|
80
|
-
(call-value :call))
|
81
|
-
(pif (listp call-value)
|
82
|
-
(cdolist (el call-value)
|
83
|
-
(pif (nart-p el)
|
84
|
-
(cpush (nart-id el) result)
|
85
|
-
(cpush el result)))
|
86
|
-
(pif (nart-p call-value)
|
87
|
-
(cpush (nart-id call-value) result)
|
88
|
-
(cpush call-value result)))
|
89
|
-
result)
|
90
|
-
END
|
91
|
-
|
92
|
-
|
93
79
|
# Sends message +msg+ directly to the Cyc server and receives
|
94
80
|
# the answer.
|
95
81
|
def talk(msg, options={})
|
96
|
-
#conn.puts(msg.respond_to?(:to_cyc) ? msg.to_cyc : msg)
|
97
|
-
msg = NART_QUERY.sub(/:call/,msg) if options[:nart]
|
98
|
-
|
99
82
|
send_message(msg)
|
100
83
|
receive_answer(options)
|
101
84
|
end
|
@@ -125,12 +108,12 @@ module Cyc
|
|
125
108
|
end
|
126
109
|
end
|
127
110
|
# XXX ignore some potential asynchronous answers
|
128
|
-
|
111
|
+
# XXX check if everything works ok
|
112
|
+
#answer = answer.split("\n")[-1]
|
129
113
|
answer = answer.sub(/(\d\d\d) (.*)/,"\\2")
|
130
114
|
if($1.to_i == 200)
|
131
115
|
begin
|
132
116
|
result = @parser.parse(answer,options[:stack])
|
133
|
-
result = options[:nart] ? substitute_narts(result) : result
|
134
117
|
rescue Parser::ContinueParsing => ex
|
135
118
|
result = ex.stack
|
136
119
|
current_result = result
|
@@ -148,49 +131,21 @@ module Cyc
|
|
148
131
|
puts $2.sub(/^"/,"").sub(/"$/,"") + "\n" +
|
149
132
|
@last_message
|
150
133
|
else
|
151
|
-
puts "
|
134
|
+
puts "Unknown error! #{answer}"
|
152
135
|
end
|
153
136
|
nil
|
154
137
|
end
|
155
138
|
end
|
156
139
|
|
157
140
|
|
158
|
-
def method_missing(name,*args)
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
def method_name.to_cyc(quote=false)
|
163
|
-
self
|
164
|
-
end
|
165
|
-
options[:nart] = true if name.to_s =~ /_nart$/
|
166
|
-
talk(([method_name] + args).to_cyc,options)
|
167
|
-
end
|
168
|
-
|
169
|
-
DENOTATION_QUERY =<<-END
|
170
|
-
(nart-denotation-mapper ":word")
|
171
|
-
END
|
172
|
-
|
173
|
-
def denotation_mapper(name)
|
174
|
-
send_message(DENOTATION_QUERY.sub(/:word/,name))
|
175
|
-
receive_answer(:nart => true)
|
176
|
-
end
|
177
|
-
|
178
|
-
|
179
|
-
# Finds collection with given name. The name has to
|
180
|
-
# be the name of the exact name of the constant.
|
181
|
-
def find_collection(name)
|
182
|
-
term = self.find_constant(name)
|
183
|
-
Collection.new(term, self) unless term.nil?
|
141
|
+
def method_missing(name,*args,&block)
|
142
|
+
@builder.reset
|
143
|
+
@builder.send(name,*args,&block)
|
144
|
+
talk(@builder.to_cyc)
|
184
145
|
end
|
185
146
|
|
186
147
|
protected
|
187
148
|
|
188
|
-
def substitute_narts(terms)
|
189
|
-
unless terms.nil?
|
190
|
-
terms.collect{|t| t.is_a?(String) ? Cyc::Nart.new(t,self) : t}
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
149
|
def relevant_mts(term)
|
195
150
|
@mts_cache[term] ||=
|
196
151
|
(mts = self.term_mts(term)
|
@@ -201,8 +156,5 @@ protected
|
|
201
156
|
[]
|
202
157
|
end)
|
203
158
|
end
|
204
|
-
|
205
|
-
def with_reconnect
|
206
|
-
end
|
207
159
|
end
|
208
160
|
end
|
data/lib/cycr/extensions.rb
CHANGED
@@ -1,25 +1,23 @@
|
|
1
1
|
class String
|
2
|
-
def to_cyc
|
3
|
-
#self =~ /_missing_method_(.*)/ ? "#{$1.gsub("_","-")}" : "\"#{self}\""
|
2
|
+
def to_cyc
|
4
3
|
"\"#{self}\""
|
5
4
|
end
|
6
5
|
end
|
7
6
|
|
8
7
|
class Symbol
|
9
|
-
def to_cyc
|
10
|
-
|
8
|
+
def to_cyc
|
9
|
+
"#\$#{self}"
|
11
10
|
end
|
12
11
|
end
|
13
12
|
|
14
13
|
class Array
|
15
|
-
def to_cyc
|
16
|
-
|
17
|
-
"("+map{|e| e.to_cyc(quote)}.join(" ")+")"
|
14
|
+
def to_cyc
|
15
|
+
"'("+map{|e| e.to_cyc}.join(" ")+")"
|
18
16
|
end
|
19
17
|
end
|
20
18
|
|
21
19
|
class Fixnum
|
22
|
-
def to_cyc
|
20
|
+
def to_cyc
|
23
21
|
to_s
|
24
22
|
end
|
25
23
|
end
|
data/lib/cycr/sexpr.rex
CHANGED
@@ -8,7 +8,7 @@ macro
|
|
8
8
|
INPUT_CHARACTER [^\r\n\"\(\):& ]
|
9
9
|
WHITE_SPACE [\ \t\f\r\n] | \r\n
|
10
10
|
SYMBOL :[^<>\r\n\"\(\):&\ ]+
|
11
|
-
CYC_SYMBOL \#\$[a-zA-Z0-9-]+
|
11
|
+
CYC_SYMBOL \#\$[a-zA-Z0-9:_-]+
|
12
12
|
ATOM [^\r\n\"\(\):&\ ]+
|
13
13
|
OPEN_PAR \(
|
14
14
|
CLOSE_PAR \)
|
@@ -37,13 +37,13 @@ rule
|
|
37
37
|
{QUOTE} { state = :STRING; @str = ""; [:in_string] }
|
38
38
|
# whitespace
|
39
39
|
{WHITE_SPACE} # ignore
|
40
|
-
:STRING {QUOTE} { state = nil; [:string,@str] }
|
41
40
|
:STRING [^\n\r\"\\]+ { @str << text; [:in_string]}
|
42
|
-
:STRING \t { @str <<
|
43
|
-
:STRING \n { @str <<
|
44
|
-
:STRING \r { @str <<
|
45
|
-
:STRING \\" { @str << '
|
46
|
-
:STRING \\ { @str <<
|
41
|
+
:STRING \t { @str << "\t"; [:in_string] }
|
42
|
+
:STRING \n { @str << "\n"; [:in_string] }
|
43
|
+
:STRING \r { @str << "\n"; [:in_string] }
|
44
|
+
:STRING \\" { @str << '"'; [:in_string] }
|
45
|
+
:STRING \\ { @str << "\\"; [:in_string] }
|
46
|
+
:STRING {QUOTE} { state = nil; [:string,@str] }
|
47
47
|
# error fallback
|
48
48
|
.|\n { raise "Illegal character <#{text}>" }
|
49
49
|
inner
|
data/lib/cycr/sexpr.rex.rb
CHANGED
@@ -76,7 +76,7 @@ class SExpressionLexer
|
|
76
76
|
when (text = ss.scan(/:[^<>\r\n\"\(\):&\ ]+/))
|
77
77
|
@rex_tokens.push action { [:symbol,text] }
|
78
78
|
|
79
|
-
when (text = ss.scan(/\#\$[a-zA-Z0-9-]+/))
|
79
|
+
when (text = ss.scan(/\#\$[a-zA-Z0-9:_-]+/))
|
80
80
|
@rex_tokens.push action { [:cyc_symbol,text] }
|
81
81
|
|
82
82
|
when (text = ss.scan(/[^\r\n\"\(\):&\ ]+/))
|
@@ -98,26 +98,26 @@ class SExpressionLexer
|
|
98
98
|
|
99
99
|
when :STRING
|
100
100
|
case
|
101
|
-
when (text = ss.scan(/\"/))
|
102
|
-
@rex_tokens.push action { state = nil; [:string,@str] }
|
103
|
-
|
104
101
|
when (text = ss.scan(/[^\n\r\"\\]+/))
|
105
102
|
@rex_tokens.push action { @str << text; [:in_string]}
|
106
103
|
|
107
104
|
when (text = ss.scan(/\t/))
|
108
|
-
@rex_tokens.push action { @str <<
|
105
|
+
@rex_tokens.push action { @str << "\t"; [:in_string] }
|
109
106
|
|
110
107
|
when (text = ss.scan(/\n/))
|
111
|
-
@rex_tokens.push action { @str <<
|
108
|
+
@rex_tokens.push action { @str << "\n"; [:in_string] }
|
112
109
|
|
113
110
|
when (text = ss.scan(/\r/))
|
114
|
-
@rex_tokens.push action { @str <<
|
111
|
+
@rex_tokens.push action { @str << "\n"; [:in_string] }
|
115
112
|
|
116
113
|
when (text = ss.scan(/\\"/))
|
117
|
-
@rex_tokens.push action { @str << '
|
114
|
+
@rex_tokens.push action { @str << '"'; [:in_string] }
|
118
115
|
|
119
116
|
when (text = ss.scan(/\\/))
|
120
|
-
@rex_tokens.push action { @str <<
|
117
|
+
@rex_tokens.push action { @str << "\\"; [:in_string] }
|
118
|
+
|
119
|
+
when (text = ss.scan(/\"/))
|
120
|
+
@rex_tokens.push action { state = nil; [:string,@str] }
|
121
121
|
|
122
122
|
else
|
123
123
|
text = ss.string[ss.pos .. -1]
|
data/spec/client.rb
CHANGED
@@ -18,13 +18,6 @@ describe Cyc::Client do
|
|
18
18
|
@client.constant_count.should_not == nil
|
19
19
|
end
|
20
20
|
|
21
|
-
it "should allow to find 'Cat' collection" do
|
22
|
-
cat = @client.find_collection("Cat")
|
23
|
-
cat.should_not == nil
|
24
|
-
cat.should be_instance_of(Cyc::Collection)
|
25
|
-
cat.symbol.should == :Cat
|
26
|
-
end
|
27
|
-
|
28
21
|
it "should allow multiple processes to use the client" do
|
29
22
|
parent_pid = Process.pid
|
30
23
|
if fork
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cycr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Aleksander Pohl
|
@@ -50,7 +50,7 @@ files:
|
|
50
50
|
- lib/cycr/parser.rb
|
51
51
|
- lib/cycr/domains.lisp
|
52
52
|
- lib/cycr/sexpr.flex
|
53
|
-
- lib/cycr/
|
53
|
+
- lib/cycr/builder.rb
|
54
54
|
- lib/cycr/constants.rb
|
55
55
|
- lib/cycr/collection.rb
|
56
56
|
- lib/cycr/sexpr.rex.rb
|
@@ -62,7 +62,7 @@ files:
|
|
62
62
|
- spec/client.rb
|
63
63
|
- spec/assertion.rb
|
64
64
|
has_rdoc: true
|
65
|
-
homepage: http://
|
65
|
+
homepage: http://github.com/apohllo/cycr
|
66
66
|
licenses: []
|
67
67
|
|
68
68
|
post_install_message:
|
data/lib/cycr/nart.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Cyc
|
2
|
-
class Nart
|
3
|
-
attr_accessor :id, :value
|
4
|
-
def initialize(id, cyc)
|
5
|
-
@id = id.to_i
|
6
|
-
@value = cyc.find_nart_by_id @id
|
7
|
-
end
|
8
|
-
|
9
|
-
def to_cyc(quote=false)
|
10
|
-
"(find-nart-by-id #{@id})"
|
11
|
-
end
|
12
|
-
|
13
|
-
def to_s
|
14
|
-
"NART[#{@id}]: #{@value.inspect} "
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.find_by_name(name,cyc)
|
18
|
-
self.new(name.match(/^NART\[([^\]]+)\]/)[1],cyc)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|