el4r 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/BUGS +2 -0
- data/Changes +2412 -0
- data/bin/el4r +26 -0
- data/bin/el4r-instance +1105 -0
- data/bin/el4r-rctool +279 -0
- data/bin/el4r-runtest +26 -0
- data/data/emacs/site-lisp/el4r.el +441 -0
- data/doc/classes/El4r.html +200 -0
- data/doc/classes/El4r.src/M000004.html +25 -0
- data/doc/classes/El4r.src/M000005.html +25 -0
- data/doc/classes/El4r.src/M000006.html +18 -0
- data/doc/classes/El4r.src/M000008.html +25 -0
- data/doc/classes/El4r.src/M000009.html +18 -0
- data/doc/classes/El4r/ELConsCell.html +145 -0
- data/doc/classes/El4r/ELConsCell.src/M000044.html +16 -0
- data/doc/classes/El4r/ELConsCell.src/M000046.html +16 -0
- data/doc/classes/El4r/ELConsCell.src/M000050.html +16 -0
- data/doc/classes/El4r/ELInstance.html +755 -0
- data/doc/classes/El4r/ELInstance.src/M000046.html +36 -0
- data/doc/classes/El4r/ELInstance.src/M000047.html +41 -0
- data/doc/classes/El4r/ELInstance.src/M000048.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000049.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000050.html +25 -0
- data/doc/classes/El4r/ELInstance.src/M000051.html +35 -0
- data/doc/classes/El4r/ELInstance.src/M000052.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000053.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000054.html +41 -0
- data/doc/classes/El4r/ELInstance.src/M000055.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000056.html +43 -0
- data/doc/classes/El4r/ELInstance.src/M000057.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000058.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000059.html +25 -0
- data/doc/classes/El4r/ELInstance.src/M000060.html +43 -0
- data/doc/classes/El4r/ELInstance.src/M000061.html +31 -0
- data/doc/classes/El4r/ELInstance.src/M000062.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000063.html +25 -0
- data/doc/classes/El4r/ELInstance.src/M000064.html +35 -0
- data/doc/classes/El4r/ELInstance.src/M000065.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000066.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000067.html +19 -0
- data/doc/classes/El4r/ELInstance.src/M000068.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000069.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000070.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000071.html +19 -0
- data/doc/classes/El4r/ELInstance.src/M000072.html +30 -0
- data/doc/classes/El4r/ELInstance.src/M000073.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000074.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000075.html +17 -0
- data/doc/classes/El4r/ELInstance.src/M000076.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000077.html +21 -0
- data/doc/classes/El4r/ELInstance.src/M000078.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000079.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000080.html +35 -0
- data/doc/classes/El4r/ELInstance.src/M000081.html +24 -0
- data/doc/classes/El4r/ELInstance.src/M000082.html +22 -0
- data/doc/classes/El4r/ELInstance.src/M000083.html +21 -0
- data/doc/classes/El4r/ELInstance.src/M000084.html +19 -0
- data/doc/classes/El4r/ELInstance.src/M000085.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000086.html +21 -0
- data/doc/classes/El4r/ELInstance.src/M000087.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000088.html +24 -0
- data/doc/classes/El4r/ELInstance.src/M000089.html +23 -0
- data/doc/classes/El4r/ELInstance.src/M000090.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000091.html +20 -0
- data/doc/classes/El4r/ELInstance.src/M000092.html +18 -0
- data/doc/classes/El4r/ELInstance.src/M000093.html +19 -0
- data/doc/classes/El4r/ELListCell.html +163 -0
- data/doc/classes/El4r/ELListCell.src/M000026.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000027.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000028.html +23 -0
- data/doc/classes/El4r/ELListCell.src/M000031.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000032.html +23 -0
- data/doc/classes/El4r/ELListCell.src/M000033.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000034.html +23 -0
- data/doc/classes/El4r/ELListCell.src/M000037.html +16 -0
- data/doc/classes/El4r/ELListCell.src/M000038.html +23 -0
- data/doc/classes/El4r/ELMethodsMixin.html +648 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000006.html +27 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000007.html +27 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000008.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000009.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000010.html +27 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000011.html +19 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000012.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000013.html +19 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000014.html +19 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000015.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000016.html +21 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000017.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000018.html +23 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000019.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000020.html +46 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000021.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000022.html +23 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000023.html +28 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000024.html +46 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000025.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000026.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000027.html +28 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000028.html +31 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000029.html +24 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000030.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000031.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000032.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000033.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000034.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000035.html +18 -0
- data/doc/classes/El4r/ELMethodsMixin.src/M000036.html +25 -0
- data/doc/classes/El4r/ELObject.html +235 -0
- data/doc/classes/El4r/ELObject.src/M000078.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000079.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000080.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000081.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000082.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000083.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000084.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000085.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000086.html +20 -0
- data/doc/classes/El4r/ELObject.src/M000087.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000088.html +20 -0
- data/doc/classes/El4r/ELObject.src/M000090.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000091.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000092.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000093.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000094.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000095.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000096.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000097.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000098.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000099.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000100.html +18 -0
- data/doc/classes/El4r/ELObject.src/M000102.html +19 -0
- data/doc/classes/El4r/ELObject.src/M000103.html +20 -0
- data/doc/classes/El4r/ELRubyObjectStock.html +283 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000030.html +21 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000031.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000032.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000033.html +42 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000034.html +19 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000035.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000036.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000037.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000038.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000039.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000040.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000041.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000042.html +22 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000043.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000044.html +17 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000045.html +46 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000046.html +19 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000047.html +21 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000048.html +19 -0
- data/doc/classes/El4r/ELRubyObjectStock.src/M000049.html +18 -0
- data/doc/classes/El4r/ELSequence.html +221 -0
- data/doc/classes/El4r/ELSequence.src/M000040.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000041.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000042.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000043.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000044.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000045.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000048.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000049.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000050.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000051.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000052.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000053.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000054.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000055.html +20 -0
- data/doc/classes/El4r/ELSequence.src/M000056.html +19 -0
- data/doc/classes/El4r/ELSequence.src/M000057.html +18 -0
- data/doc/classes/El4r/ELSequence.src/M000058.html +19 -0
- data/doc/classes/El4r/ELVariables.html +173 -0
- data/doc/classes/El4r/ELVariables.src/M000037.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000038.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000039.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000040.html +23 -0
- data/doc/classes/El4r/ELVariables.src/M000045.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000046.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000047.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000048.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000049.html +23 -0
- data/doc/classes/El4r/ELVariables.src/M000051.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000052.html +18 -0
- data/doc/classes/El4r/ELVariables.src/M000053.html +23 -0
- data/doc/classes/El4r/ELVector.html +160 -0
- data/doc/classes/El4r/ELVector.src/M000028.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000029.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000030.html +16 -0
- data/doc/classes/El4r/ELVector.src/M000033.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000034.html +16 -0
- data/doc/classes/El4r/ELVector.src/M000035.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000036.html +16 -0
- data/doc/classes/El4r/ELVector.src/M000039.html +22 -0
- data/doc/classes/El4r/ELVector.src/M000040.html +16 -0
- data/doc/classes/El4r/El4rOutput.html +175 -0
- data/doc/classes/El4r/El4rOutput.src/M000080.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000081.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000088.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000089.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000090.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000091.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000092.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000094.html +18 -0
- data/doc/classes/El4r/El4rOutput.src/M000095.html +21 -0
- data/doc/classes/El4r/El4rOutput.src/M000096.html +18 -0
- data/doc/classes/El4rAccessor.html +134 -0
- data/doc/classes/El4rAccessor.src/M000005.html +18 -0
- data/doc/classes/ElApp.html +211 -0
- data/doc/classes/ElApp.src/M000001.html +21 -0
- data/doc/classes/ElApp.src/M000002.html +17 -0
- data/doc/classes/ElApp.src/M000003.html +18 -0
- data/doc/classes/ElApp.src/M000004.html +18 -0
- data/doc/classes/ElMixin.html +163 -0
- data/doc/classes/ElMixin.src/M000001.html +19 -0
- data/doc/classes/ElMixin.src/M000002.html +19 -0
- data/doc/classes/ElMixin.src/M000003.html +18 -0
- data/doc/classes/ElMixin.src/M000004.html +18 -0
- data/doc/classes/ElMixin.src/M000006.html +19 -0
- data/doc/classes/ElMixin.src/M000007.html +18 -0
- data/doc/created.rid +1 -0
- data/doc/files/bin/el4r-instance.html +119 -0
- data/doc/fr_class_index.html +40 -0
- data/doc/fr_file_index.html +27 -0
- data/doc/fr_method_index.html +129 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/el4r.en.html +468 -0
- data/el4r.ja.html +640 -0
- data/files +29 -0
- data/lib/el4r/el4r-sub.rb +1023 -0
- data/lib/el4r/emacsruby/autoload/70el4r-mode.rb +9 -0
- data/lib/el4r/emacsruby/el4r-mode.rb +35 -0
- data/lib/el4r/emacsruby/stdlib.rb +37 -0
- data/lib/el4r/exec-el4r.rb +182 -0
- data/man/el4r.1 +125 -0
- data/setup.rb +1551 -0
- data/testing/alltest.rb +5 -0
- data/testing/badcase.rb +50 -0
- data/testing/el4r.e +262 -0
- data/testing/euc.txt +1 -0
- data/testing/jis.txt +1 -0
- data/testing/sjis.txt +1 -0
- data/testing/test-el4r.rb +1053 -0
- data/testing/test-gc.rb +81 -0
- data/testing/test.el +16 -0
- data/testing/test.rb +97 -0
- data/testing/utf8.txt +1 -0
- metadata +311 -0
data/bin/el4r-rctool
ADDED
@@ -0,0 +1,279 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#### Embedded RCtool ####
|
3
|
+
# RCtool - Automatic generate/update rcfiles.
|
4
|
+
# Copyright (C) 2005 rubikitch <rubikitch@ruby-lang.org>
|
5
|
+
# Version: $Id: rctool.rb 1016 2005-12-09 00:33:33Z rubikitch $
|
6
|
+
|
7
|
+
# This program is free software; you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU General Public License as published by
|
9
|
+
# the Free Software Foundation; either version 2 of the License, or
|
10
|
+
# (at your option) any later version.
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU General Public License for more details.
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program; if not, write to the Free Software
|
17
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18
|
+
|
19
|
+
require 'fileutils'
|
20
|
+
require 'optparse'
|
21
|
+
|
22
|
+
class RCtool
|
23
|
+
def initialize(x={})
|
24
|
+
@no_op = x[:no_op]
|
25
|
+
@windows_p = (RUBY_PLATFORM =~ /win/i)
|
26
|
+
@backup_dir = x[:backup_dir] || "backup"
|
27
|
+
@home_dir = (x[:home_dir] || File.expand_path("~")).chomp "/"
|
28
|
+
@name = x[:name]
|
29
|
+
|
30
|
+
@patches = []
|
31
|
+
|
32
|
+
@verbose = true
|
33
|
+
|
34
|
+
unless @no_op
|
35
|
+
at_exit {
|
36
|
+
commit
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
Patch = Struct.new :file, :block, :comment_start, :template, :where
|
42
|
+
def define_patch(file, block, comment_start, template="%s", where=:append)
|
43
|
+
@patches << Patch.new(file, block, comment_start, template, where)
|
44
|
+
end
|
45
|
+
|
46
|
+
#######
|
47
|
+
private
|
48
|
+
#######
|
49
|
+
|
50
|
+
def beginning_of_block(comment_start)
|
51
|
+
"#{comment_start} Beginning of the #{@name} block:"
|
52
|
+
end
|
53
|
+
|
54
|
+
def attention_msg(comment_start)
|
55
|
+
"#{comment_start} RCtool generated this block automatically. " +
|
56
|
+
"DO NOT MODIFY this block!"
|
57
|
+
end
|
58
|
+
|
59
|
+
def end_of_block(comment_start)
|
60
|
+
"#{comment_start} End of the #{@name} block."
|
61
|
+
end
|
62
|
+
|
63
|
+
def user_area_msg(comment_start)
|
64
|
+
"#{comment_start} User-setting area is below this line."
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def set_filenames(file)
|
69
|
+
if file[0,1] == '/' then
|
70
|
+
backup_dir = "#{@backup_dir}/__absolute__"
|
71
|
+
@target_file = file
|
72
|
+
elsif @windows_p and file[0,2] =~ /[A-Z]:/i # for windows
|
73
|
+
backup_dir = "#{@backup_dir}/__absolute__"
|
74
|
+
@target_file = file
|
75
|
+
file = file[2..-1]
|
76
|
+
else
|
77
|
+
backup_dir = "#{@backup_dir}/"
|
78
|
+
@target_file = "#{@home_dir}/#{file}"
|
79
|
+
end
|
80
|
+
@backup_file = "#{backup_dir}#{file}.backup"
|
81
|
+
@modified_file = "#{backup_dir}#{file}.new"
|
82
|
+
|
83
|
+
FileUtils.mkdir_p [File.dirname(@target_file), File.dirname(@modified_file)] unless @no_op
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
def apply_patch(patch)
|
88
|
+
file, block, comment_start, template, where = patch.to_a
|
89
|
+
|
90
|
+
use_template = false
|
91
|
+
unless File.exist? @target_file
|
92
|
+
use_template = true
|
93
|
+
File.open(@target_file, "w") {}
|
94
|
+
raise "failed to write #{@target_file}" unless File.exist? @target_file
|
95
|
+
end
|
96
|
+
FileUtils.cp @target_file, @backup_file, :verbose=>@verbose
|
97
|
+
|
98
|
+
open(@modified_file, "w") {|f|
|
99
|
+
puts "Generating #{@modified_file}..." if @verbose
|
100
|
+
old_content = File.read(@target_file)
|
101
|
+
|
102
|
+
bob = beginning_of_block comment_start
|
103
|
+
attention = attention_msg comment_start
|
104
|
+
eob = end_of_block comment_start
|
105
|
+
user_area = user_area_msg comment_start
|
106
|
+
|
107
|
+
bob_re = Regexp.quote bob
|
108
|
+
eob_re = Regexp.quote eob
|
109
|
+
user_area_re = Regexp.quote user_area
|
110
|
+
|
111
|
+
block = ["", bob, attention, block.chomp, eob, user_area]
|
112
|
+
|
113
|
+
m = old_content.match(/\n?#{bob_re}\n.+^#{eob_re}\n(#{user_area_re}\n)?/m)
|
114
|
+
if m # target_file exists / has block
|
115
|
+
block = block[1..-1] if where == :prepend and old_content =~ /\A#{bob_re}/
|
116
|
+
f.print m.pre_match
|
117
|
+
f.puts block
|
118
|
+
f.print m.post_match
|
119
|
+
elsif use_template # target_file does not exist
|
120
|
+
f.printf(template, block.join("\n").strip)
|
121
|
+
elsif where == :append # target_file exists / has no block
|
122
|
+
f.print old_content
|
123
|
+
f.puts block
|
124
|
+
elsif where == :prepend # target_file exists / has no block
|
125
|
+
f.puts block.join("\n").strip
|
126
|
+
f.print old_content
|
127
|
+
else
|
128
|
+
raise ArgumentError, "invalid where: #{where}"
|
129
|
+
end
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
def install_file(patch)
|
134
|
+
FileUtils.cp @modified_file, @target_file, :verbose=>@verbose
|
135
|
+
end
|
136
|
+
|
137
|
+
def uninstall_file(patch)
|
138
|
+
FileUtils.cp @backup_file, @target_file, :verbose=>@verbose
|
139
|
+
end
|
140
|
+
|
141
|
+
def diff_file(patch)
|
142
|
+
system "diff -u #{@backup_file} #{@modified_file}"
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
def commit
|
147
|
+
method_for_each_patch = nil
|
148
|
+
ARGV.options {|o|
|
149
|
+
o.on("-p", "--prepare",
|
150
|
+
"create the modified and backup rcfiles"
|
151
|
+
) { method_for_each_patch = :apply_patch}
|
152
|
+
o.on("-d", "--diff",
|
153
|
+
"show the differences between the modified and the backup rcfiles"
|
154
|
+
) { method_for_each_patch = :diff_file}
|
155
|
+
o.on("-i", "--install",
|
156
|
+
"copy the modified rcfiles from BACKUPDIR to HOME"
|
157
|
+
) { method_for_each_patch = :install_file}
|
158
|
+
o.on("-u", "--uninstall",
|
159
|
+
"copy the backup rcfiles from BACKUPDIR to HOME"
|
160
|
+
) { method_for_each_patch = :uninstall_file}
|
161
|
+
o.on("-q", "--quiet", "quiet output") { @verbose=false }
|
162
|
+
|
163
|
+
o.parse!
|
164
|
+
|
165
|
+
if method_for_each_patch
|
166
|
+
@patches.each do |patch|
|
167
|
+
set_filenames patch.file
|
168
|
+
__send__ method_for_each_patch, patch
|
169
|
+
end
|
170
|
+
else
|
171
|
+
puts o.help
|
172
|
+
end
|
173
|
+
|
174
|
+
}
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
#### Definition ####
|
181
|
+
# (shell-command "rm ~/.el4rrc.rb")
|
182
|
+
# (progn (find-sh "rake rctool; bin/el4r-rctool -p ; bin/el4r-rctool -d; bin/el4r-rctool -i") (find-filez "~/.el4rrc.rb ~/.emacs ~/.el4r/init.rb"))
|
183
|
+
# (find-sh "ruby ~/.el4rrc.rb")
|
184
|
+
require 'tmpdir'
|
185
|
+
require 'rbconfig'
|
186
|
+
include Config
|
187
|
+
|
188
|
+
home_dir_expr = %q!ENV['EL4R_HOME'] || File.expand_path("~/.el4r")!
|
189
|
+
home_dir = eval home_dir_expr
|
190
|
+
|
191
|
+
bindir = CONFIG["bindir"]
|
192
|
+
datadir = CONFIG["datadir"]
|
193
|
+
sitelibdir = CONFIG["sitelibdir"]
|
194
|
+
rubylibdir = CONFIG["rubylibdir"]
|
195
|
+
|
196
|
+
if File.directory? File.join(rubylibdir, "el4r") # debian
|
197
|
+
emacsrubydir = File.join(rubylibdir, "el4r/emacsruby")
|
198
|
+
siteemacsrubydir = File.join(sitelibdir, "el4r/emacsruby")
|
199
|
+
else
|
200
|
+
emacsrubydir = File.join(sitelibdir, "el4r/emacsruby")
|
201
|
+
siteemacsrubydir = File.join(home_dir, "site")
|
202
|
+
end
|
203
|
+
|
204
|
+
el_program = File.expand_path('emacs/site-lisp/el4r.el', datadir)
|
205
|
+
el_dir = File.dirname el_program
|
206
|
+
|
207
|
+
rc = RCtool.new(:name=>"el4r")
|
208
|
+
rc.define_patch(".el4rrc.rb", <<END_OF_BLOCK, "#", <<END_OF_TEMPLATE, :prepend)
|
209
|
+
### Internal variables
|
210
|
+
@stdlib_dir = #{emacsrubydir.dump}
|
211
|
+
@site_dir = #{siteemacsrubydir.dump}
|
212
|
+
@autoload_dir = #{File.join(emacsrubydir, "autoload").dump}
|
213
|
+
@el_program_relative = "data/emacs/site-lisp/el4r.el"
|
214
|
+
@instance_program_relative = "bin/el4r-instance"
|
215
|
+
@el_program = #{el_program.dump}
|
216
|
+
@instance_program = #{File.expand_path('el4r-instance', bindir).dump}
|
217
|
+
@lisp_object_gc_trigger_count = 100
|
218
|
+
@lisp_object_gc_trigger_increment = 100
|
219
|
+
@ruby_gc_trigger_count = 100
|
220
|
+
@ruby_gc_trigger_increment = 100
|
221
|
+
@log_buffer = "*el4r:log*"
|
222
|
+
@output_buffer = "*el4r:output*"
|
223
|
+
@unittest_lisp_object_gc_trigger_count = 5000
|
224
|
+
@unittest_lisp_object_gc_trigger_increment = 5000
|
225
|
+
@unittest_ruby_gc_trigger_count = 5000
|
226
|
+
@unittest_ruby_gc_trigger_increment = 5000
|
227
|
+
@temp_file = "#{Dir.tmpdir}/el4r-\#{ENV['USER'] || ENV['USERNAME'] || 'me'}.tmp"
|
228
|
+
|
229
|
+
### El4r bootstrap code
|
230
|
+
def __conf__
|
231
|
+
if ENV['EL4R_ROOT']
|
232
|
+
$: << File.join(ENV['EL4R_ROOT'], "lib")
|
233
|
+
end
|
234
|
+
require 'el4r/el4r-sub'
|
235
|
+
ConfigScript.new(__FILE__)
|
236
|
+
end
|
237
|
+
|
238
|
+
def __elisp_init__
|
239
|
+
$> << "(setq \\n"
|
240
|
+
instance_variables.map{|iv| [iv[1..-1], instance_variable_get(iv)]}.each {|k,v| $> << "el4r-\#{k.gsub(/_/,'-')} \#{v.inspect}\\n" if Numeric === v or String === v}
|
241
|
+
$> << ')' << "\n"
|
242
|
+
end
|
243
|
+
|
244
|
+
at_exit { __elisp_init__ if __FILE__==$0 }
|
245
|
+
|
246
|
+
### Customizable variables
|
247
|
+
### You can override these variables in User-setting area.
|
248
|
+
# directory containing EmacsRuby scripts
|
249
|
+
@home_dir = #{home_dir_expr}
|
250
|
+
# startup EmacsRuby script
|
251
|
+
@init_script = "init.rb"
|
252
|
+
# EmacsRuby search path
|
253
|
+
@el4r_load_path = [ @home_dir, @site_dir, @stdlib_dir, "." ]
|
254
|
+
END_OF_BLOCK
|
255
|
+
%s
|
256
|
+
|
257
|
+
# Ruby interpreter name used by el4r
|
258
|
+
@ruby_program = "ruby"
|
259
|
+
# Emacs program name used by el4r / el4r-runtest.rb
|
260
|
+
@emacs_program = "emacs"
|
261
|
+
END_OF_TEMPLATE
|
262
|
+
|
263
|
+
|
264
|
+
dotemacs_block = <<END_OF_BLOCK
|
265
|
+
(add-to-list 'load-path #{el_dir.dump})
|
266
|
+
(require 'el4r)
|
267
|
+
(el4r-boot)
|
268
|
+
END_OF_BLOCK
|
269
|
+
|
270
|
+
rc.define_patch(".emacs", dotemacs_block, ";;", "%s", :append)
|
271
|
+
xemacs_init = ".xemacs/init.el"
|
272
|
+
if File.exist?(File.expand_path(xemacs_init, ENV['HOME']))
|
273
|
+
rc.define_patch(xemacs_init, dotemacs_block, ";;", "%s", :append)
|
274
|
+
end
|
275
|
+
|
276
|
+
rc.define_patch("#{home_dir}/init.rb", <<END_OF_BLOCK, "#", "%s", :prepend)
|
277
|
+
# This is the el4r initialization file.
|
278
|
+
END_OF_BLOCK
|
279
|
+
|
data/bin/el4r-runtest
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# el4r - EmacsLisp for Ruby
|
3
|
+
# Copyright (C) 2005 rubikitch <rubikitch@ruby-lang.org>
|
4
|
+
# Version: $Id: el4r-runtest 852 2005-11-15 19:38:07Z rubikitch $
|
5
|
+
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; either version 2 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU 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, write to the Free Software
|
18
|
+
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19
|
+
|
20
|
+
require 'el4r/exec-el4r'
|
21
|
+
exec_el4r true
|
22
|
+
|
23
|
+
|
24
|
+
# Local Variables:
|
25
|
+
# modes: (ruby-mode emacs-lisp-mode)
|
26
|
+
# End:
|
@@ -0,0 +1,441 @@
|
|
1
|
+
;; el4r - EmacsLisp for Ruby
|
2
|
+
;; Copyright (C) 2005 rubikitch <rubikitch@ruby-lang.org>
|
3
|
+
;; Version: $Id: el4r.el 1280 2006-06-24 08:33:17Z rubikitch $
|
4
|
+
|
5
|
+
;; This file is *NOT* part of GNU Emacs.
|
6
|
+
|
7
|
+
;; This program is free software; you can redistribute it and/or
|
8
|
+
;; modify it under the terms of the GNU General Public License as
|
9
|
+
;; published by the Free Software Foundation; either version 2, or (at
|
10
|
+
;; your option) any later version.
|
11
|
+
|
12
|
+
;; This program is distributed in the hope that it will be useful, but
|
13
|
+
;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15
|
+
;; General Public License for more details.
|
16
|
+
|
17
|
+
;; You should have received a copy of the GNU General Public License
|
18
|
+
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
19
|
+
;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
20
|
+
|
21
|
+
|
22
|
+
(or (>= emacs-major-version 21)
|
23
|
+
(error "Sorry, el4r requires (X)Emacs21 or later, because it uses weak hash."))
|
24
|
+
|
25
|
+
(put 'el4r-ruby-error
|
26
|
+
'error-conditions
|
27
|
+
'(error el4r-ruby-error))
|
28
|
+
(put 'el4r-ruby-error 'error-message "Error raised in Ruby")
|
29
|
+
|
30
|
+
(defvar el4r-ruby-program "ruby"
|
31
|
+
"The name of Ruby binary.")
|
32
|
+
|
33
|
+
(defvar el4r-instance-program (expand-file-name "~/src/el4r/bin/el4r-instance")
|
34
|
+
"Full path of el4r-instance.")
|
35
|
+
|
36
|
+
(defvar el4r-instance-args nil)
|
37
|
+
(defvar el4r-debug-on-error nil)
|
38
|
+
(defvar el4r-coding-system nil)
|
39
|
+
|
40
|
+
(defvar el4r-process nil)
|
41
|
+
(defvar el4r-process-name "el4r")
|
42
|
+
(defvar el4r-process-bufname "*el4r:process*")
|
43
|
+
(defvar el4r-call-level 0)
|
44
|
+
(defvar el4r-last-error-desc nil)
|
45
|
+
|
46
|
+
(defvar el4r-ruby-object-ids nil)
|
47
|
+
(defvar el4r-ruby-object-weakhash nil)
|
48
|
+
;(defvar el4r-defun-hash nil)
|
49
|
+
(defvar el4r-defun-lambdas nil)
|
50
|
+
(defvar el4r-lisp-object-hash nil)
|
51
|
+
(defvar el4r-lisp-object-lastid 0)
|
52
|
+
(defvar el4r-lisp-object-gc-trigger-count 100)
|
53
|
+
(defvar el4r-lisp-object-gc-trigger-increment 100)
|
54
|
+
|
55
|
+
(defun call-process-to-string (program &rest args)
|
56
|
+
(with-temp-buffer
|
57
|
+
(apply 'call-process program nil t nil args)
|
58
|
+
(buffer-string)))
|
59
|
+
|
60
|
+
(defun call-process-and-eval (program &rest args)
|
61
|
+
(eval (read (apply 'call-process-to-string program args))))
|
62
|
+
|
63
|
+
(defun el4r-running-p ()
|
64
|
+
(not (null el4r-process)))
|
65
|
+
|
66
|
+
(unless (fboundp 'process-send-signal)
|
67
|
+
(defun process-send-signal (signal process-or-name)
|
68
|
+
(signal-process (process-id (get-process process-or-name)) signal))
|
69
|
+
)
|
70
|
+
|
71
|
+
(defun el4r-boot (&optional noinit)
|
72
|
+
"Start el4r process, load ~/.el4r/init.rb, and prepare log buffer."
|
73
|
+
(interactive "P")
|
74
|
+
(with-current-buffer (get-buffer-create el4r-process-bufname) (erase-buffer))
|
75
|
+
(with-current-buffer (get-buffer-create "*el4r:log*")
|
76
|
+
(let ((buffer-read-only))
|
77
|
+
(buffer-disable-undo)
|
78
|
+
(erase-buffer)))
|
79
|
+
(el4r-init)
|
80
|
+
(el4r-ruby-eval
|
81
|
+
(if noinit "el4r_boot__noinit" "el4r_boot"))
|
82
|
+
)
|
83
|
+
|
84
|
+
(defun el4r-shutdown ()
|
85
|
+
"Shutdown el4r."
|
86
|
+
(interactive)
|
87
|
+
(when (el4r-running-p)
|
88
|
+
(el4r-ruby-eval "el4r_shutdown")
|
89
|
+
(process-send-signal 'SIGTERM (process-name el4r-process))
|
90
|
+
(setq el4r-process nil)
|
91
|
+
))
|
92
|
+
|
93
|
+
(defun el4r-restart ()
|
94
|
+
"Shutdown then start el4r."
|
95
|
+
(interactive)
|
96
|
+
(el4r-shutdown)
|
97
|
+
(el4r-boot))
|
98
|
+
|
99
|
+
(defun el4r-load (script)
|
100
|
+
"Loads Ruby script from ~/.el4r directory."
|
101
|
+
(el4r-ruby-call nil "el4r_load" script))
|
102
|
+
|
103
|
+
(defun el4r-recover ()
|
104
|
+
(interactive)
|
105
|
+
(with-current-buffer el4r-process-bufname
|
106
|
+
(erase-buffer)))
|
107
|
+
|
108
|
+
(defun el4r-override-variables ())
|
109
|
+
|
110
|
+
(defun el4r-init ()
|
111
|
+
;; In many cases (eq el4r-process (get-buffer-process el4r-process-bufname))
|
112
|
+
;; But this sexp is nil when el4r-instance is accidentally dead.
|
113
|
+
(and (get-buffer-process el4r-process-bufname) (el4r-shutdown))
|
114
|
+
;; Override el4r-related variables from ~/.el4rrc.rb
|
115
|
+
(call-process-and-eval el4r-ruby-program (expand-file-name "~/.el4rrc.rb"))
|
116
|
+
(el4r-override-variables)
|
117
|
+
(setq el4r-lisp-object-hash (make-hash-table :test 'eq))
|
118
|
+
(setq el4r-ruby-object-weakhash (make-hash-table :test 'eq :weakness 'value))
|
119
|
+
; (setq el4r-defun-hash (make-hash-table :test 'eq))
|
120
|
+
(setq el4r-defun-lambdas nil)
|
121
|
+
(let ((buffer el4r-process-bufname)
|
122
|
+
(process-connection-type nil)) ; Use a pipe.
|
123
|
+
(and (get-buffer buffer) (kill-buffer buffer))
|
124
|
+
(get-buffer-create buffer)
|
125
|
+
(with-current-buffer buffer
|
126
|
+
(buffer-disable-undo)
|
127
|
+
;; fixme I do not know why.
|
128
|
+
;; (set (make-local-variable 'process-adaptive-read-buffering) nil)
|
129
|
+
(setq el4r-process (apply 'start-process el4r-process-name buffer
|
130
|
+
el4r-ruby-program el4r-instance-program el4r-instance-args))
|
131
|
+
(and el4r-coding-system
|
132
|
+
(set-process-coding-system el4r-process
|
133
|
+
el4r-coding-system el4r-coding-system)))
|
134
|
+
(message "el4r started.")
|
135
|
+
))
|
136
|
+
|
137
|
+
|
138
|
+
(defun el4r-check-alive ()
|
139
|
+
(or (eq (process-status el4r-process) 'run)
|
140
|
+
(error "el4r-instance is dead.")))
|
141
|
+
|
142
|
+
(defun el4r-scan-expr-from-ruby ()
|
143
|
+
(with-current-buffer el4r-process-bufname
|
144
|
+
(goto-char (point-min))
|
145
|
+
(save-match-data
|
146
|
+
(let ((point-after-zero (search-forward "\0" nil t))
|
147
|
+
expr)
|
148
|
+
(if point-after-zero
|
149
|
+
(progn
|
150
|
+
(setq expr
|
151
|
+
(buffer-substring (point-min) (- point-after-zero 1)))
|
152
|
+
(delete-region (point-min) point-after-zero)
|
153
|
+
expr
|
154
|
+
)))
|
155
|
+
)))
|
156
|
+
|
157
|
+
(defun el4r-recv ()
|
158
|
+
(let ((expr))
|
159
|
+
(while (eq nil (progn (setq expr (el4r-scan-expr-from-ruby)) expr))
|
160
|
+
(el4r-check-alive)
|
161
|
+
(accept-process-output el4r-process))
|
162
|
+
expr))
|
163
|
+
|
164
|
+
(defun el4r-send (rubyexpr)
|
165
|
+
(el4r-check-alive)
|
166
|
+
(process-send-string el4r-process rubyexpr)
|
167
|
+
(process-send-string el4r-process "\0\n"))
|
168
|
+
|
169
|
+
(defvar el4r-error-lisp-expression nil)
|
170
|
+
(defun el4r-get ()
|
171
|
+
(let ((result (el4r-recv)) expr)
|
172
|
+
(while (eq (length result) 0)
|
173
|
+
(el4r-wait-expr)
|
174
|
+
(setq result (el4r-recv)))
|
175
|
+
(condition-case err
|
176
|
+
(eval (setq expr (read result)))
|
177
|
+
;; !DRY! (find-function 'el4r-wait-expr)
|
178
|
+
(el4r-ruby-error (signal 'el4r-ruby-error nil))
|
179
|
+
(error (setq el4r-error-lisp-expression expr)
|
180
|
+
(signal (car err) (cdr err))))
|
181
|
+
))
|
182
|
+
|
183
|
+
(defun el4r-signal-last-error ()
|
184
|
+
(signal (car el4r-last-error-desc) (cdr el4r-last-error-desc)))
|
185
|
+
|
186
|
+
(defun el4r-enter-call () (setq el4r-call-level (+ el4r-call-level 1)))
|
187
|
+
(defun el4r-leave-call () (setq el4r-call-level (- el4r-call-level 1)))
|
188
|
+
(defun el4r-callback-p () (not (eq el4r-call-level 0)))
|
189
|
+
(defun el4r-send-interrupt () (el4r-send ""))
|
190
|
+
|
191
|
+
(defun el4r-no-properties (str)
|
192
|
+
(setq str (copy-sequence str))
|
193
|
+
(set-text-properties 0 (length str) nil str)
|
194
|
+
str)
|
195
|
+
|
196
|
+
(defvar el4r-treat-ctrl-codes nil)
|
197
|
+
|
198
|
+
(defvar el4r-temp-file nil)
|
199
|
+
(defvar obj nil)
|
200
|
+
(defsubst el4r-string-to-rubystr (str)
|
201
|
+
(let ((file-read "File.read(conf.temp_file)"))
|
202
|
+
(if (or (not el4r-treat-ctrl-codes)
|
203
|
+
(string= str file-read))
|
204
|
+
(concat "%q" (prin1-to-string (el4r-no-properties obj)))
|
205
|
+
(cond ((eq el4r-treat-ctrl-codes 'use-file) ;experimental
|
206
|
+
;; !FIXME! coding-system @ XEmacs
|
207
|
+
(with-temp-buffer
|
208
|
+
(insert str)
|
209
|
+
;; suppress "wrote file-name" message
|
210
|
+
;; (find-efunctiondescr 'write-region "VISIT is neither")
|
211
|
+
(write-region 1 (point-max) el4r-temp-file nil 0))
|
212
|
+
file-read)
|
213
|
+
(t
|
214
|
+
(concat "%Q"
|
215
|
+
(with-temp-buffer
|
216
|
+
(insert (prin1-to-string (el4r-no-properties str)))
|
217
|
+
(mapcar (lambda (x)
|
218
|
+
(goto-char 1)
|
219
|
+
(while (search-forward (car x) nil t)
|
220
|
+
(replace-match (cdr x))))
|
221
|
+
'(("#" . "\\\\#")
|
222
|
+
("\003" . "\\\\cc")
|
223
|
+
("\004" . "\\\\cd")
|
224
|
+
("\021" . "\\\\cq")
|
225
|
+
("\023" . "\\\\cs")
|
226
|
+
("\026" . "\\\\cv")
|
227
|
+
("\027" . "\\\\cw")
|
228
|
+
("\031" . "\\\\cy")
|
229
|
+
("\032" . "\\\\cz")
|
230
|
+
))
|
231
|
+
(buffer-string)))
|
232
|
+
|
233
|
+
)))))
|
234
|
+
|
235
|
+
|
236
|
+
(defun el4r-proper-list-p (expression)
|
237
|
+
;; Tell if a list is proper, id est, that it is `nil' or ends with `nil'.
|
238
|
+
(cond ((not expression))
|
239
|
+
((consp expression) (not (cdr (last expression))))))
|
240
|
+
|
241
|
+
(defun el4r-lisp2ruby (obj)
|
242
|
+
(cond ((eq obj nil) "nil")
|
243
|
+
((eq obj t) "true")
|
244
|
+
((numberp obj) (number-to-string obj))
|
245
|
+
((stringp obj) (el4r-string-to-rubystr obj))
|
246
|
+
((el4r-rubyexpr-p obj) (el4r-rubyexpr-string obj))
|
247
|
+
((el4r-rubyobj-p obj)
|
248
|
+
(format "el4r_rubyobj_stock.id2obj(%s)"
|
249
|
+
(el4r-rubyobj-id obj)))
|
250
|
+
((el4r-proper-list-p obj)
|
251
|
+
(format "el4r_elobject_new(%d, ELListCell)"
|
252
|
+
(el4r-lisp-object-to-id obj)))
|
253
|
+
((and (consp obj) (atom (cdr obj)))
|
254
|
+
(format "el4r_elobject_new(%d, ELConsCell)"
|
255
|
+
(el4r-lisp-object-to-id obj)))
|
256
|
+
((vectorp obj)
|
257
|
+
(format "el4r_elobject_new(%d, ELVector)"
|
258
|
+
(el4r-lisp-object-to-id obj)))
|
259
|
+
(t
|
260
|
+
(format "el4r_elobject_new(%d)"
|
261
|
+
(el4r-lisp-object-to-id obj)))
|
262
|
+
))
|
263
|
+
|
264
|
+
(defun el4r-wait-expr ()
|
265
|
+
(el4r-enter-call)
|
266
|
+
(let (evaled rubyexpr)
|
267
|
+
(condition-case err
|
268
|
+
(progn (setq evaled (el4r-get))
|
269
|
+
(setq rubyexpr (el4r-lisp2ruby evaled)))
|
270
|
+
(el4r-ruby-error (setq rubyexpr "el4r_reraise_last_error"))
|
271
|
+
(error (setq el4r-last-error-desc err)
|
272
|
+
(setq rubyexpr "el4r_raise_lisp_error")))
|
273
|
+
(el4r-send rubyexpr))
|
274
|
+
(el4r-leave-call))
|
275
|
+
|
276
|
+
(defun el4r-ruby-eval (rubyexpr)
|
277
|
+
(and (eq 0 (length rubyexpr)) (error "Empty expression is not evaluatable."))
|
278
|
+
(and (el4r-callback-p) (el4r-send-interrupt))
|
279
|
+
(el4r-enter-call)
|
280
|
+
(el4r-send rubyexpr)
|
281
|
+
(let ((result (el4r-get)))
|
282
|
+
(el4r-leave-call)
|
283
|
+
result
|
284
|
+
))
|
285
|
+
|
286
|
+
(defun el4r-lisp-object-from-id (id)
|
287
|
+
(or (gethash id el4r-lisp-object-hash)
|
288
|
+
(error "No such object for given ID: %d" id)))
|
289
|
+
|
290
|
+
(defun el4r-lisp-object-to-id (obj)
|
291
|
+
(el4r-gc-lisp-objects-if-required)
|
292
|
+
(let ((id el4r-lisp-object-lastid))
|
293
|
+
(setq el4r-lisp-object-lastid (+ id 1))
|
294
|
+
(puthash id obj el4r-lisp-object-hash)
|
295
|
+
id
|
296
|
+
))
|
297
|
+
|
298
|
+
(defun el4r-garbage-collect ()
|
299
|
+
"Force garbage collection for el4r."
|
300
|
+
(interactive)
|
301
|
+
(el4r-gc-lisp-objects)
|
302
|
+
(el4r-ruby-eval "el4r_rubyobj_stock.garbage_collect")
|
303
|
+
(message "el4r garbage collected"))
|
304
|
+
|
305
|
+
|
306
|
+
(defun el4r-gc-lisp-objects ()
|
307
|
+
(let ((ids (el4r-ruby-call nil 'el4r_get_garbage_lispobj_ids)))
|
308
|
+
(while ids
|
309
|
+
(remhash (car ids) el4r-lisp-object-hash)
|
310
|
+
(setq ids (cdr ids))
|
311
|
+
)))
|
312
|
+
|
313
|
+
(defun el4r-gc-lisp-objects-if-required ()
|
314
|
+
(if (>= (hash-table-count el4r-lisp-object-hash)
|
315
|
+
el4r-lisp-object-gc-trigger-count)
|
316
|
+
(progn (el4r-gc-lisp-objects)
|
317
|
+
(setq el4r-lisp-object-gc-trigger-count
|
318
|
+
(+ (hash-table-count el4r-lisp-object-hash)
|
319
|
+
el4r-lisp-object-gc-trigger-increment)))
|
320
|
+
))
|
321
|
+
|
322
|
+
(defun el4r-rubyobj-p (rubyobj)
|
323
|
+
(and (listp rubyobj) (eq (car rubyobj) 'el4r-rubyobj)))
|
324
|
+
(defun el4r-rubyobj-id (rubyobj)
|
325
|
+
(cdr rubyobj))
|
326
|
+
(defun el4r-rubyobj-create (id)
|
327
|
+
(let ((rubyobj (cons 'el4r-rubyobj id)))
|
328
|
+
(setq el4r-ruby-object-ids (cons id el4r-ruby-object-ids))
|
329
|
+
(puthash id rubyobj el4r-ruby-object-weakhash)
|
330
|
+
rubyobj))
|
331
|
+
(defun el4r-rubyobj-get-alive-ids ()
|
332
|
+
(garbage-collect)
|
333
|
+
;; (let (ids)
|
334
|
+
;; (maphash (lambda (id obj)
|
335
|
+
;; (setq ids (cons id ids)))
|
336
|
+
;; el4r-ruby-object-weakhash)
|
337
|
+
;; ids))
|
338
|
+
|
339
|
+
;; Introduce new variable `el4r-ruby-object-ids' and stop using
|
340
|
+
;; maphash to avoid fatal exception. I do not know why maphash
|
341
|
+
;; causes fatal. This idea is borrowed from pymacs.
|
342
|
+
(let ((ids el4r-ruby-object-ids)
|
343
|
+
used-ids)
|
344
|
+
(while ids
|
345
|
+
(let ((id (car ids)))
|
346
|
+
(setq ids (cdr ids))
|
347
|
+
(if (gethash id el4r-ruby-object-weakhash)
|
348
|
+
(setq used-ids (cons id used-ids))
|
349
|
+
)))
|
350
|
+
(setq el4r-ruby-object-ids used-ids)
|
351
|
+
used-ids))
|
352
|
+
|
353
|
+
(defun el4r-rubyexpr-p (rubyexpr)
|
354
|
+
(and (listp rubyexpr) (eq (car rubyexpr) 'el4r-rubyexpr)))
|
355
|
+
(defun el4r-rubyexpr-string (rubyexpr)
|
356
|
+
(cdr rubyexpr))
|
357
|
+
(defun el4r-rubyexpr-quote (string)
|
358
|
+
(cons 'el4r-rubyexpr string))
|
359
|
+
|
360
|
+
;; disabled
|
361
|
+
' (defun el4r-list-to-rubyseq (list)
|
362
|
+
(let (tokens)
|
363
|
+
(while list
|
364
|
+
(setq tokens
|
365
|
+
(cons ", " (cons (el4r-lisp2ruby (car list)) tokens)))
|
366
|
+
(setq list (cdr list)))
|
367
|
+
(setq tokens (nreverse (cdr tokens)))
|
368
|
+
(apply 'concat tokens)))
|
369
|
+
(defun el4r-list-to-rubyseq (list)
|
370
|
+
(mapconcat (lambda (x)
|
371
|
+
(el4r-lisp2ruby x))
|
372
|
+
list ", "))
|
373
|
+
|
374
|
+
(defun el4r-list-to-rubyary (list)
|
375
|
+
(el4r-rubyexpr-quote (format "[%s]" (el4r-list-to-rubyseq list))))
|
376
|
+
(defun el4r-cons-to-rubyary (cons)
|
377
|
+
(el4r-list-to-rubyary (list (car cons) (cdr cons))))
|
378
|
+
|
379
|
+
(defalias 'el4r-vector-to-rubyseq 'el4r-list-to-rubyseq)
|
380
|
+
(defalias 'el4r-vector-to-rubyary 'el4r-list-to-rubyary)
|
381
|
+
|
382
|
+
(defun el4r-ruby-call (receiver name &rest args)
|
383
|
+
"Invoke ruby's method. (RECEIVER can be nil.)"
|
384
|
+
(setq name (cond ((symbolp name) (symbol-name name))
|
385
|
+
((stringp name) name)
|
386
|
+
(t (error "Invalid value for method name: %s" name))))
|
387
|
+
(setq receiver (cond ((eq receiver nil) "self")
|
388
|
+
(t (format "el4r_rubyobj_stock.id2obj(%s)"
|
389
|
+
(el4r-rubyobj-id receiver)))))
|
390
|
+
(el4r-ruby-eval (format "%s.%s(%s)"
|
391
|
+
receiver
|
392
|
+
name
|
393
|
+
(el4r-list-to-rubyseq args))))
|
394
|
+
|
395
|
+
(defun el4r-lambda-for-rubyproc (rubyproc-id &rest preform)
|
396
|
+
(let ((lmd (eval (append '(lambda (&rest args)) ;; Lazy list play!
|
397
|
+
preform
|
398
|
+
(list (list 'el4r-ruby-call-proc-by-id
|
399
|
+
rubyproc-id
|
400
|
+
'args)))
|
401
|
+
)))
|
402
|
+
(setq el4r-ruby-object-ids (cons rubyproc-id el4r-ruby-object-ids))
|
403
|
+
(puthash rubyproc-id lmd el4r-ruby-object-weakhash)
|
404
|
+
lmd))
|
405
|
+
(defun el4r-ruby-call-proc-by-id (rubyproc-id args)
|
406
|
+
(el4r-ruby-eval (format "el4r_rubyobj_stock.id2obj(%s).call(%s)"
|
407
|
+
rubyproc-id (el4r-list-to-rubyseq args))))
|
408
|
+
(defun el4r-ruby-call-proc (rubyproc &rest args)
|
409
|
+
(el4r-ruby-call-proc-by-id (el4r-rubyobj-id rubyproc) args))
|
410
|
+
|
411
|
+
(defun el4r-ruby-eval-prompt (expr)
|
412
|
+
"Read and execute Ruby code."
|
413
|
+
(interactive "sEval Ruby: ")
|
414
|
+
(message (prin1-to-string (el4r-ruby-eval expr)))
|
415
|
+
)
|
416
|
+
|
417
|
+
(defun el4r-ruby-eval-region (point mark)
|
418
|
+
"Execute the region as Ruby code."
|
419
|
+
(interactive "r")
|
420
|
+
(el4r-ruby-eval-prompt (buffer-substring point mark)))
|
421
|
+
|
422
|
+
(defun el4r-ruby-eval-buffer ()
|
423
|
+
"Execute the buffer as Ruby code."
|
424
|
+
(interactive)
|
425
|
+
(el4r-ruby-eval-prompt (buffer-string)))
|
426
|
+
|
427
|
+
(defun el4r-debug-ruby-eval-report (expr)
|
428
|
+
(interactive "sEval Ruby: ")
|
429
|
+
(insert (format "%s\n => %s\n"
|
430
|
+
expr
|
431
|
+
(prin1-to-string (el4r-ruby-eval expr)))))
|
432
|
+
|
433
|
+
(defun el4r-register-lambda (func)
|
434
|
+
(setq el4r-defun-lambdas (cons func el4r-defun-lambdas)))
|
435
|
+
|
436
|
+
(defun el4r-define-function (name func)
|
437
|
+
(fset name func)
|
438
|
+
(el4r-register-lambda func)
|
439
|
+
nil)
|
440
|
+
|
441
|
+
(provide 'el4r)
|