relisp 1.0.1 → 1.1.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.
- data/CHANGELOG +14 -0
- data/README +22 -22
- data/Rakefile +4 -3
- data/examples/elisp_master/elisp_master.el +70 -34
- data/examples/elisp_master/ruby_slave.rb +37 -0
- data/examples/elisp_master/ruby_slave2.rb +33 -0
- data/examples/ruby_master/basic.rb +20 -0
- data/examples/ruby_master/debugging.rb +32 -0
- data/examples/ruby_master/elisp_data_types.rb +26 -0
- data/examples/ruby_master/method_missing.rb +24 -0
- data/examples/ruby_master/recursive_calling.rb +11 -0
- data/lib/relisp/elisp_functions.rb +30 -13
- data/lib/relisp/slaves.rb +39 -35
- data/lib/relisp/type_conversion/editing_types.rb +677 -643
- data/lib/relisp/type_conversion/programming_types.rb +70 -117
- data/lib/relisp/type_conversion.rb +43 -2
- data/lib/relisp.rb +5 -2
- data/manual_test/tests.el +0 -2
- data/manual_test/tests.rb +0 -29
- data/src/relisp.el +223 -220
- data/test/test_editing_types.rb +4 -3
- data/test/test_elisp_functions.rb +0 -1
- data/test/test_programming_types.rb +5 -4
- data/test/test_slaves.rb +2 -1
- metadata +15 -10
- data/examples/elisp_master/ruby_slave +0 -26
- data/examples/ruby_master/ruby_master_example +0 -27
- data/setup.rb +0 -1598
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (C) 2009
|
2
|
+
# Copyright (C) 2009, 2010 Don March
|
3
3
|
#
|
4
4
|
# This file is part of Relisp.
|
5
5
|
#
|
@@ -77,25 +77,26 @@
|
|
77
77
|
# the +to_elisp+ method actually results in elisp code that, when run,
|
78
78
|
# returns the appropriate object.
|
79
79
|
|
80
|
+
Relisp::Integer = Integer
|
81
|
+
Relisp::Float = Float
|
82
|
+
Relisp::Symbol = Symbol
|
83
|
+
Relisp::String = String
|
84
|
+
Relisp::HashTable = Hash
|
85
|
+
|
80
86
|
module Relisp
|
81
87
|
|
82
|
-
Integer = 1.class
|
83
88
|
class Integer
|
84
89
|
def self.from_elisp(object)
|
85
90
|
object[:string].to_i
|
86
91
|
end
|
87
92
|
end
|
88
93
|
|
89
|
-
|
90
|
-
Float = (3.14).class
|
91
94
|
class Float
|
92
95
|
def self.from_elisp(object)
|
93
96
|
object[:string].to_f
|
94
97
|
end
|
95
98
|
end
|
96
99
|
|
97
|
-
|
98
|
-
Symbol = :flag.class
|
99
100
|
class Symbol
|
100
101
|
def self.from_elisp(object)
|
101
102
|
if object[:string] == 'nil'
|
@@ -103,11 +104,13 @@ module Relisp
|
|
103
104
|
elsif object[:string] == 't'
|
104
105
|
true
|
105
106
|
else
|
107
|
+
# object[:string].gsub('-', '_').to_sym
|
106
108
|
object[:string].to_sym
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
110
112
|
def to_elisp
|
113
|
+
# "'" + self.to_s.gsub('_', '-')
|
111
114
|
"'" + self.to_s
|
112
115
|
end
|
113
116
|
|
@@ -134,48 +137,6 @@ module Relisp
|
|
134
137
|
end
|
135
138
|
end
|
136
139
|
|
137
|
-
#
|
138
|
-
# class Cons < Proxy
|
139
|
-
# def self.from_elisp(object)
|
140
|
-
# slave = object[:slave]
|
141
|
-
# object_variable = slave.get_permanent_variable(object[:variable])
|
142
|
-
# car = slave.elisp_eval("(car #{object_variable})")
|
143
|
-
# cdr = slave.elisp_eval("(cdr #{object_variable})")
|
144
|
-
# new(car, cdr)
|
145
|
-
# end
|
146
|
-
|
147
|
-
# def initialize(car, cdr)
|
148
|
-
# @car = car
|
149
|
-
# @cdr = cdr
|
150
|
-
# end
|
151
|
-
|
152
|
-
# attr_accessor :car, :cdr
|
153
|
-
|
154
|
-
# def to_list
|
155
|
-
# end
|
156
|
-
|
157
|
-
# def inspect
|
158
|
-
# to_s
|
159
|
-
# end
|
160
|
-
|
161
|
-
# def to_s
|
162
|
-
# str = "(" + car.inspect
|
163
|
-
# if @cdr
|
164
|
-
# cdr = @cdr
|
165
|
-
# while cdr.kind_of?(Cons)
|
166
|
-
# str << " #{cdr.car.inspect}"
|
167
|
-
# cdr = cdr.cdr
|
168
|
-
# end
|
169
|
-
# str << " . #{cdr.inspect}" unless cdr == nil
|
170
|
-
# str << ")"
|
171
|
-
# end
|
172
|
-
# end
|
173
|
-
|
174
|
-
# def to_elisp
|
175
|
-
# str = "(cons #{@car.to_elisp} #{@cdr.to_elisp})"
|
176
|
-
# end
|
177
|
-
# end
|
178
|
-
|
179
140
|
# A proxy to an Emacs cons. If the cons is actually a list, the
|
180
141
|
# to_list method will convert it a subclass of Array so that all of
|
181
142
|
# the ruby Array stuff is available.
|
@@ -209,41 +170,18 @@ module Relisp
|
|
209
170
|
@slave.setcdr(@elisp_variable.value, newcdr)
|
210
171
|
end
|
211
172
|
|
212
|
-
|
213
|
-
#
|
214
|
-
|
215
|
-
@slave.car(@elisp_variable.value)
|
216
|
-
end
|
173
|
+
##
|
174
|
+
# :method: car
|
175
|
+
# car, cdr, cadr, etc. are taken care of by Proxy.method_missing.
|
217
176
|
|
218
|
-
|
219
|
-
#
|
220
|
-
def cdr
|
221
|
-
@slave.cdr(@elisp_variable.value)
|
222
|
-
end
|
177
|
+
##
|
178
|
+
# :method: cdr
|
223
179
|
|
224
|
-
|
225
|
-
#
|
226
|
-
def caar
|
227
|
-
@slave.caar(@elisp_variable.value)
|
228
|
-
end
|
180
|
+
##
|
181
|
+
# :method: cadr
|
229
182
|
|
230
|
-
|
231
|
-
#
|
232
|
-
def cadr
|
233
|
-
@slave.cadr(@elisp_variable.value)
|
234
|
-
end
|
235
|
-
|
236
|
-
# Return the +cdr+ of the +car+ of the Cons. (+cdar+)
|
237
|
-
#
|
238
|
-
def cdar
|
239
|
-
@slave.cadr(@elisp_variable.value)
|
240
|
-
end
|
241
|
-
|
242
|
-
# Return the +cdr+ of the +cdr+ of the Cons. (+cddr+)
|
243
|
-
#
|
244
|
-
def cddr
|
245
|
-
@slave.cadr(@elisp_variable.value)
|
246
|
-
end
|
183
|
+
##
|
184
|
+
# :method: cdar
|
247
185
|
|
248
186
|
# This function will NOT return true whenever the elisp function
|
249
187
|
# <tt>listp</tt> is true. The elisp function is true whenever the
|
@@ -253,15 +191,21 @@ module Relisp
|
|
253
191
|
# using the elisp function +list+.
|
254
192
|
#
|
255
193
|
def list?
|
256
|
-
current_cdr = cdr
|
257
|
-
while current_cdr.kind_of?(Cons)
|
258
|
-
|
259
|
-
end
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
194
|
+
# current_cdr = cdr
|
195
|
+
# while current_cdr.kind_of?(Cons)
|
196
|
+
# current_cdr = current_cdr.cdr
|
197
|
+
# end
|
198
|
+
# return ! current_cdr.nil?
|
199
|
+
|
200
|
+
current_cdr_var = @slave.new_elisp_variable
|
201
|
+
@slave.elisp_exec "(setq #{current_cdr_var} (cdr #{to_elisp}))"
|
202
|
+
while @slave.elisp_eval "(consp #{current_cdr_var})"
|
203
|
+
@slave.elisp_exec "(setq #{current_cdr_var} (cdr #{current_cdr_var}))"
|
264
204
|
end
|
205
|
+
cdr = @slave.elisp_eval "#{current_cdr_var}"
|
206
|
+
@slave.elisp_exec "(makunbound '#{current_cdr_var})"
|
207
|
+
|
208
|
+
return ! cdr
|
265
209
|
end
|
266
210
|
|
267
211
|
# Translate the cons cell into a Relisp::List, a subclass of
|
@@ -269,25 +213,43 @@ module Relisp
|
|
269
213
|
#
|
270
214
|
def to_list
|
271
215
|
list_array = []
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
216
|
+
|
217
|
+
# list_array << @slave.elisp_eval("(car #{to_elisp})")
|
218
|
+
# current_cdr = @slave.elisp_eval("(cdr #{to_elisp})")
|
219
|
+
# while current_cdr.kind_of?(Cons)
|
220
|
+
# list_array << @slave.elisp_eval("(car #{current_cdr.to_elisp})")
|
221
|
+
# current_cdr = @slave.elisp_eval("(cdr #{current_cdr.to_elisp})")
|
222
|
+
# end
|
223
|
+
|
224
|
+
# if current_cdr.nil?
|
225
|
+
# return Relisp::List.new(list_array)
|
226
|
+
# else
|
227
|
+
# return false
|
228
|
+
# end
|
229
|
+
|
230
|
+
current_cdr_var = @slave.new_elisp_variable
|
231
|
+
|
232
|
+
list_array << @slave.elisp_eval("(car #{to_elisp})")
|
233
|
+
@slave.elisp_exec "(setq #{current_cdr_var} (cdr #{to_elisp}))"
|
234
|
+
while @slave.elisp_eval "(consp #{current_cdr_var})"
|
235
|
+
list_array << @slave.elisp_eval("(car #{current_cdr_var})")
|
236
|
+
@slave.elisp_exec "(setq #{current_cdr_var} (cdr #{current_cdr_var}))"
|
277
237
|
end
|
278
238
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
239
|
+
cdr = @slave.elisp_eval "#{current_cdr_var}"
|
240
|
+
|
241
|
+
@slave.elisp_exec "(makunbound '#{current_cdr_var})"
|
242
|
+
|
243
|
+
if cdr
|
244
|
+
raise "Not a list: #{cdr}"
|
283
245
|
end
|
246
|
+
|
247
|
+
return Relisp::List.new(list_array)
|
284
248
|
end
|
285
249
|
|
286
250
|
alias to_a to_list
|
287
|
-
|
288
251
|
end
|
289
252
|
|
290
|
-
|
291
253
|
class List < Array
|
292
254
|
def self.from_elisp(object)
|
293
255
|
new(super(object))
|
@@ -302,8 +264,6 @@ module Relisp
|
|
302
264
|
end
|
303
265
|
end
|
304
266
|
|
305
|
-
|
306
|
-
String = "words, words, words".class
|
307
267
|
class String
|
308
268
|
def self.from_elisp(object)
|
309
269
|
new(eval(object[:string]))
|
@@ -314,7 +274,6 @@ module Relisp
|
|
314
274
|
end
|
315
275
|
end
|
316
276
|
|
317
|
-
|
318
277
|
class Vector < Array
|
319
278
|
def self.from_elisp(object)
|
320
279
|
new(super(object))
|
@@ -329,8 +288,6 @@ module Relisp
|
|
329
288
|
end
|
330
289
|
end
|
331
290
|
|
332
|
-
|
333
|
-
HashTable = {:money => "power"}.class
|
334
291
|
class HashTable
|
335
292
|
def self.from_elisp(object)
|
336
293
|
slave = object[:slave]
|
@@ -344,11 +301,11 @@ module Relisp
|
|
344
301
|
slave.elisp_exec( "(setq #{keys_var} nil)" )
|
345
302
|
slave.elisp_exec( "(setq #{vals_var} nil)" )
|
346
303
|
slave.elisp_exec( "(maphash (lambda (key val)
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
304
|
+
(setq #{keys_var} (append #{keys_var} (list key)))
|
305
|
+
(setq #{vals_var} (append #{vals_var} (list val))))
|
306
|
+
#{object_variable})" )
|
307
|
+
keys = Cons.new(keys_var, slave)
|
308
|
+
vals = Cons.new(vals_var, slave)
|
352
309
|
keys = keys.to_list
|
353
310
|
vals = vals.to_list
|
354
311
|
hash = Hash.new
|
@@ -356,9 +313,9 @@ module Relisp
|
|
356
313
|
hash[keys[i]] = vals[i]
|
357
314
|
end
|
358
315
|
|
359
|
-
|
360
|
-
|
361
|
-
|
316
|
+
[:object_variable, :keys_var, :vals_var]. each do |var|
|
317
|
+
slave.elisp_exec "(makunbound '#{var})"
|
318
|
+
end
|
362
319
|
|
363
320
|
return hash
|
364
321
|
end
|
@@ -375,7 +332,6 @@ module Relisp
|
|
375
332
|
|
376
333
|
end
|
377
334
|
|
378
|
-
|
379
335
|
# Every object is given a default +to_elisp+ method, and classes get a
|
380
336
|
# dummy +from_elisp+ method.
|
381
337
|
#
|
@@ -402,22 +358,19 @@ class NilClass
|
|
402
358
|
end
|
403
359
|
end
|
404
360
|
|
405
|
-
|
406
361
|
class TrueClass
|
407
362
|
def to_elisp
|
408
363
|
"t"
|
409
364
|
end
|
410
365
|
end
|
411
366
|
|
412
|
-
|
413
367
|
class FalseClass
|
414
|
-
#
|
368
|
+
# Because falseness in elisp is represented by 'nil'.
|
415
369
|
def to_elisp
|
416
370
|
nil.to_elisp
|
417
371
|
end
|
418
372
|
end
|
419
373
|
|
420
|
-
|
421
374
|
# The normal Array class is modified so that an array can be converted
|
422
375
|
# to either Relisp::List or Relisp::Vector.
|
423
376
|
#
|
@@ -1,3 +1,25 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (C) 2009, 2010 Don March
|
3
|
+
#
|
4
|
+
# This file is part of Relisp.
|
5
|
+
#
|
6
|
+
# Relisp is free software: you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# Relisp is distributed in the hope that it will be useful, but
|
12
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU General Public License
|
17
|
+
# along with this program. If not, see
|
18
|
+
# <http://www.gnu.org/licenses/>.
|
19
|
+
#++
|
20
|
+
#
|
21
|
+
#
|
22
|
+
|
1
23
|
module Relisp
|
2
24
|
|
3
25
|
# Proxy contains the code that creates a wrapper around a variable
|
@@ -5,7 +27,8 @@ module Relisp
|
|
5
27
|
#
|
6
28
|
class Proxy
|
7
29
|
def self.from_elisp(object)
|
8
|
-
|
30
|
+
slave = object[:slave]
|
31
|
+
new(slave.get_permanent_variable(object[:variable]), slave)
|
9
32
|
end
|
10
33
|
|
11
34
|
# If the last argument is a Relisp::Slave, it gets pulled off and
|
@@ -23,7 +46,8 @@ module Relisp
|
|
23
46
|
end
|
24
47
|
|
25
48
|
if args[0].kind_of?(Symbol) && args[1].nil?
|
26
|
-
@elisp_variable = @slave.get_permanent_variable(args[0])
|
49
|
+
# @elisp_variable = @slave.get_permanent_variable(args[0])
|
50
|
+
@elisp_variable = args[0]
|
27
51
|
elisp_type= ""
|
28
52
|
self.class.to_s.split("::").last.split(//).each_with_index do |char, index|
|
29
53
|
unless index==0 || char == char.downcase
|
@@ -47,14 +71,31 @@ module Relisp
|
|
47
71
|
@elisp_variable
|
48
72
|
end
|
49
73
|
|
74
|
+
def makunbound
|
75
|
+
@slave.makunbound @elisp_variable
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.elisp_alias(ruby_name, elisp_name)
|
79
|
+
class_eval <<-EOM
|
80
|
+
def #{ruby_name}
|
81
|
+
call_on_self :#{elisp_name}
|
82
|
+
end
|
83
|
+
EOM
|
84
|
+
end
|
85
|
+
|
50
86
|
private
|
51
87
|
|
52
88
|
def call_on_self(function, *args)
|
53
89
|
@slave.send(function, @elisp_variable.value, *args)
|
54
90
|
end
|
91
|
+
|
92
|
+
def method_missing(function, *args)
|
93
|
+
call_on_self(function, *args)
|
94
|
+
end
|
55
95
|
end
|
56
96
|
|
57
97
|
end
|
58
98
|
|
59
99
|
require 'relisp/type_conversion/editing_types'
|
60
100
|
require 'relisp/type_conversion/programming_types'
|
101
|
+
|
data/lib/relisp.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (C) 2009
|
2
|
+
# Copyright (C) 2009, 2010 Don March
|
3
3
|
#
|
4
4
|
# This file is part of Relisp.
|
5
5
|
#
|
@@ -19,11 +19,14 @@
|
|
19
19
|
#++
|
20
20
|
|
21
21
|
module Relisp
|
22
|
-
VERSION = '1.0
|
22
|
+
VERSION = '1.1.0'
|
23
23
|
|
24
24
|
class ElispError < RuntimeError; end
|
25
25
|
end
|
26
26
|
|
27
|
+
$:.unshift File.dirname(__FILE__)
|
28
|
+
|
27
29
|
require 'relisp/type_conversion'
|
28
30
|
require 'relisp/elisp_functions'
|
29
31
|
require 'relisp/slaves'
|
32
|
+
|
data/manual_test/tests.el
CHANGED
data/manual_test/tests.rb
CHANGED
@@ -31,34 +31,5 @@ def window_scroll_down
|
|
31
31
|
selected_window.visible?(1)
|
32
32
|
end
|
33
33
|
|
34
|
-
def window_shrink
|
35
|
-
w = selected_window
|
36
|
-
w2 = w.split_vertically
|
37
|
-
w3 = w2.split_horizontally
|
38
|
-
10.times do
|
39
|
-
w.shrink(1)
|
40
|
-
redisplay
|
41
|
-
sleep 0.01
|
42
|
-
end
|
43
|
-
10.times do
|
44
|
-
w.enlarge(1)
|
45
|
-
redisplay
|
46
|
-
sleep 0.01
|
47
|
-
end
|
48
|
-
10.times do
|
49
|
-
w2.shrink(0,1)
|
50
|
-
redisplay
|
51
|
-
sleep 0.01
|
52
|
-
end
|
53
|
-
10.times do
|
54
|
-
w2.enlarge(0,1)
|
55
|
-
redisplay
|
56
|
-
sleep 0.01
|
57
|
-
end
|
58
|
-
|
59
|
-
w2.delete
|
60
|
-
w3.delete
|
61
|
-
end
|
62
|
-
|
63
34
|
slave.start
|
64
35
|
|