el4r 1.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.
Files changed (249) hide show
  1. data/BUGS +2 -0
  2. data/Changes +2412 -0
  3. data/bin/el4r +26 -0
  4. data/bin/el4r-instance +1105 -0
  5. data/bin/el4r-rctool +279 -0
  6. data/bin/el4r-runtest +26 -0
  7. data/data/emacs/site-lisp/el4r.el +441 -0
  8. data/doc/classes/El4r.html +200 -0
  9. data/doc/classes/El4r.src/M000004.html +25 -0
  10. data/doc/classes/El4r.src/M000005.html +25 -0
  11. data/doc/classes/El4r.src/M000006.html +18 -0
  12. data/doc/classes/El4r.src/M000008.html +25 -0
  13. data/doc/classes/El4r.src/M000009.html +18 -0
  14. data/doc/classes/El4r/ELConsCell.html +145 -0
  15. data/doc/classes/El4r/ELConsCell.src/M000044.html +16 -0
  16. data/doc/classes/El4r/ELConsCell.src/M000046.html +16 -0
  17. data/doc/classes/El4r/ELConsCell.src/M000050.html +16 -0
  18. data/doc/classes/El4r/ELInstance.html +755 -0
  19. data/doc/classes/El4r/ELInstance.src/M000046.html +36 -0
  20. data/doc/classes/El4r/ELInstance.src/M000047.html +41 -0
  21. data/doc/classes/El4r/ELInstance.src/M000048.html +31 -0
  22. data/doc/classes/El4r/ELInstance.src/M000049.html +22 -0
  23. data/doc/classes/El4r/ELInstance.src/M000050.html +25 -0
  24. data/doc/classes/El4r/ELInstance.src/M000051.html +35 -0
  25. data/doc/classes/El4r/ELInstance.src/M000052.html +31 -0
  26. data/doc/classes/El4r/ELInstance.src/M000053.html +23 -0
  27. data/doc/classes/El4r/ELInstance.src/M000054.html +41 -0
  28. data/doc/classes/El4r/ELInstance.src/M000055.html +31 -0
  29. data/doc/classes/El4r/ELInstance.src/M000056.html +43 -0
  30. data/doc/classes/El4r/ELInstance.src/M000057.html +31 -0
  31. data/doc/classes/El4r/ELInstance.src/M000058.html +22 -0
  32. data/doc/classes/El4r/ELInstance.src/M000059.html +25 -0
  33. data/doc/classes/El4r/ELInstance.src/M000060.html +43 -0
  34. data/doc/classes/El4r/ELInstance.src/M000061.html +31 -0
  35. data/doc/classes/El4r/ELInstance.src/M000062.html +22 -0
  36. data/doc/classes/El4r/ELInstance.src/M000063.html +25 -0
  37. data/doc/classes/El4r/ELInstance.src/M000064.html +35 -0
  38. data/doc/classes/El4r/ELInstance.src/M000065.html +23 -0
  39. data/doc/classes/El4r/ELInstance.src/M000066.html +23 -0
  40. data/doc/classes/El4r/ELInstance.src/M000067.html +19 -0
  41. data/doc/classes/El4r/ELInstance.src/M000068.html +18 -0
  42. data/doc/classes/El4r/ELInstance.src/M000069.html +20 -0
  43. data/doc/classes/El4r/ELInstance.src/M000070.html +18 -0
  44. data/doc/classes/El4r/ELInstance.src/M000071.html +19 -0
  45. data/doc/classes/El4r/ELInstance.src/M000072.html +30 -0
  46. data/doc/classes/El4r/ELInstance.src/M000073.html +20 -0
  47. data/doc/classes/El4r/ELInstance.src/M000074.html +20 -0
  48. data/doc/classes/El4r/ELInstance.src/M000075.html +17 -0
  49. data/doc/classes/El4r/ELInstance.src/M000076.html +18 -0
  50. data/doc/classes/El4r/ELInstance.src/M000077.html +21 -0
  51. data/doc/classes/El4r/ELInstance.src/M000078.html +18 -0
  52. data/doc/classes/El4r/ELInstance.src/M000079.html +18 -0
  53. data/doc/classes/El4r/ELInstance.src/M000080.html +35 -0
  54. data/doc/classes/El4r/ELInstance.src/M000081.html +24 -0
  55. data/doc/classes/El4r/ELInstance.src/M000082.html +22 -0
  56. data/doc/classes/El4r/ELInstance.src/M000083.html +21 -0
  57. data/doc/classes/El4r/ELInstance.src/M000084.html +19 -0
  58. data/doc/classes/El4r/ELInstance.src/M000085.html +18 -0
  59. data/doc/classes/El4r/ELInstance.src/M000086.html +21 -0
  60. data/doc/classes/El4r/ELInstance.src/M000087.html +18 -0
  61. data/doc/classes/El4r/ELInstance.src/M000088.html +24 -0
  62. data/doc/classes/El4r/ELInstance.src/M000089.html +23 -0
  63. data/doc/classes/El4r/ELInstance.src/M000090.html +18 -0
  64. data/doc/classes/El4r/ELInstance.src/M000091.html +20 -0
  65. data/doc/classes/El4r/ELInstance.src/M000092.html +18 -0
  66. data/doc/classes/El4r/ELInstance.src/M000093.html +19 -0
  67. data/doc/classes/El4r/ELListCell.html +163 -0
  68. data/doc/classes/El4r/ELListCell.src/M000026.html +16 -0
  69. data/doc/classes/El4r/ELListCell.src/M000027.html +16 -0
  70. data/doc/classes/El4r/ELListCell.src/M000028.html +23 -0
  71. data/doc/classes/El4r/ELListCell.src/M000031.html +16 -0
  72. data/doc/classes/El4r/ELListCell.src/M000032.html +23 -0
  73. data/doc/classes/El4r/ELListCell.src/M000033.html +16 -0
  74. data/doc/classes/El4r/ELListCell.src/M000034.html +23 -0
  75. data/doc/classes/El4r/ELListCell.src/M000037.html +16 -0
  76. data/doc/classes/El4r/ELListCell.src/M000038.html +23 -0
  77. data/doc/classes/El4r/ELMethodsMixin.html +648 -0
  78. data/doc/classes/El4r/ELMethodsMixin.src/M000006.html +27 -0
  79. data/doc/classes/El4r/ELMethodsMixin.src/M000007.html +27 -0
  80. data/doc/classes/El4r/ELMethodsMixin.src/M000008.html +18 -0
  81. data/doc/classes/El4r/ELMethodsMixin.src/M000009.html +18 -0
  82. data/doc/classes/El4r/ELMethodsMixin.src/M000010.html +27 -0
  83. data/doc/classes/El4r/ELMethodsMixin.src/M000011.html +19 -0
  84. data/doc/classes/El4r/ELMethodsMixin.src/M000012.html +18 -0
  85. data/doc/classes/El4r/ELMethodsMixin.src/M000013.html +19 -0
  86. data/doc/classes/El4r/ELMethodsMixin.src/M000014.html +19 -0
  87. data/doc/classes/El4r/ELMethodsMixin.src/M000015.html +18 -0
  88. data/doc/classes/El4r/ELMethodsMixin.src/M000016.html +21 -0
  89. data/doc/classes/El4r/ELMethodsMixin.src/M000017.html +18 -0
  90. data/doc/classes/El4r/ELMethodsMixin.src/M000018.html +23 -0
  91. data/doc/classes/El4r/ELMethodsMixin.src/M000019.html +18 -0
  92. data/doc/classes/El4r/ELMethodsMixin.src/M000020.html +46 -0
  93. data/doc/classes/El4r/ELMethodsMixin.src/M000021.html +18 -0
  94. data/doc/classes/El4r/ELMethodsMixin.src/M000022.html +23 -0
  95. data/doc/classes/El4r/ELMethodsMixin.src/M000023.html +28 -0
  96. data/doc/classes/El4r/ELMethodsMixin.src/M000024.html +46 -0
  97. data/doc/classes/El4r/ELMethodsMixin.src/M000025.html +18 -0
  98. data/doc/classes/El4r/ELMethodsMixin.src/M000026.html +18 -0
  99. data/doc/classes/El4r/ELMethodsMixin.src/M000027.html +28 -0
  100. data/doc/classes/El4r/ELMethodsMixin.src/M000028.html +31 -0
  101. data/doc/classes/El4r/ELMethodsMixin.src/M000029.html +24 -0
  102. data/doc/classes/El4r/ELMethodsMixin.src/M000030.html +18 -0
  103. data/doc/classes/El4r/ELMethodsMixin.src/M000031.html +18 -0
  104. data/doc/classes/El4r/ELMethodsMixin.src/M000032.html +18 -0
  105. data/doc/classes/El4r/ELMethodsMixin.src/M000033.html +18 -0
  106. data/doc/classes/El4r/ELMethodsMixin.src/M000034.html +18 -0
  107. data/doc/classes/El4r/ELMethodsMixin.src/M000035.html +18 -0
  108. data/doc/classes/El4r/ELMethodsMixin.src/M000036.html +25 -0
  109. data/doc/classes/El4r/ELObject.html +235 -0
  110. data/doc/classes/El4r/ELObject.src/M000078.html +19 -0
  111. data/doc/classes/El4r/ELObject.src/M000079.html +18 -0
  112. data/doc/classes/El4r/ELObject.src/M000080.html +19 -0
  113. data/doc/classes/El4r/ELObject.src/M000081.html +18 -0
  114. data/doc/classes/El4r/ELObject.src/M000082.html +19 -0
  115. data/doc/classes/El4r/ELObject.src/M000083.html +18 -0
  116. data/doc/classes/El4r/ELObject.src/M000084.html +18 -0
  117. data/doc/classes/El4r/ELObject.src/M000085.html +18 -0
  118. data/doc/classes/El4r/ELObject.src/M000086.html +20 -0
  119. data/doc/classes/El4r/ELObject.src/M000087.html +19 -0
  120. data/doc/classes/El4r/ELObject.src/M000088.html +20 -0
  121. data/doc/classes/El4r/ELObject.src/M000090.html +19 -0
  122. data/doc/classes/El4r/ELObject.src/M000091.html +19 -0
  123. data/doc/classes/El4r/ELObject.src/M000092.html +18 -0
  124. data/doc/classes/El4r/ELObject.src/M000093.html +19 -0
  125. data/doc/classes/El4r/ELObject.src/M000094.html +18 -0
  126. data/doc/classes/El4r/ELObject.src/M000095.html +18 -0
  127. data/doc/classes/El4r/ELObject.src/M000096.html +18 -0
  128. data/doc/classes/El4r/ELObject.src/M000097.html +19 -0
  129. data/doc/classes/El4r/ELObject.src/M000098.html +18 -0
  130. data/doc/classes/El4r/ELObject.src/M000099.html +18 -0
  131. data/doc/classes/El4r/ELObject.src/M000100.html +18 -0
  132. data/doc/classes/El4r/ELObject.src/M000102.html +19 -0
  133. data/doc/classes/El4r/ELObject.src/M000103.html +20 -0
  134. data/doc/classes/El4r/ELRubyObjectStock.html +283 -0
  135. data/doc/classes/El4r/ELRubyObjectStock.src/M000030.html +21 -0
  136. data/doc/classes/El4r/ELRubyObjectStock.src/M000031.html +22 -0
  137. data/doc/classes/El4r/ELRubyObjectStock.src/M000032.html +22 -0
  138. data/doc/classes/El4r/ELRubyObjectStock.src/M000033.html +42 -0
  139. data/doc/classes/El4r/ELRubyObjectStock.src/M000034.html +19 -0
  140. data/doc/classes/El4r/ELRubyObjectStock.src/M000035.html +22 -0
  141. data/doc/classes/El4r/ELRubyObjectStock.src/M000036.html +22 -0
  142. data/doc/classes/El4r/ELRubyObjectStock.src/M000037.html +22 -0
  143. data/doc/classes/El4r/ELRubyObjectStock.src/M000038.html +22 -0
  144. data/doc/classes/El4r/ELRubyObjectStock.src/M000039.html +17 -0
  145. data/doc/classes/El4r/ELRubyObjectStock.src/M000040.html +17 -0
  146. data/doc/classes/El4r/ELRubyObjectStock.src/M000041.html +22 -0
  147. data/doc/classes/El4r/ELRubyObjectStock.src/M000042.html +22 -0
  148. data/doc/classes/El4r/ELRubyObjectStock.src/M000043.html +17 -0
  149. data/doc/classes/El4r/ELRubyObjectStock.src/M000044.html +17 -0
  150. data/doc/classes/El4r/ELRubyObjectStock.src/M000045.html +46 -0
  151. data/doc/classes/El4r/ELRubyObjectStock.src/M000046.html +19 -0
  152. data/doc/classes/El4r/ELRubyObjectStock.src/M000047.html +21 -0
  153. data/doc/classes/El4r/ELRubyObjectStock.src/M000048.html +19 -0
  154. data/doc/classes/El4r/ELRubyObjectStock.src/M000049.html +18 -0
  155. data/doc/classes/El4r/ELSequence.html +221 -0
  156. data/doc/classes/El4r/ELSequence.src/M000040.html +18 -0
  157. data/doc/classes/El4r/ELSequence.src/M000041.html +18 -0
  158. data/doc/classes/El4r/ELSequence.src/M000042.html +20 -0
  159. data/doc/classes/El4r/ELSequence.src/M000043.html +19 -0
  160. data/doc/classes/El4r/ELSequence.src/M000044.html +18 -0
  161. data/doc/classes/El4r/ELSequence.src/M000045.html +19 -0
  162. data/doc/classes/El4r/ELSequence.src/M000048.html +18 -0
  163. data/doc/classes/El4r/ELSequence.src/M000049.html +20 -0
  164. data/doc/classes/El4r/ELSequence.src/M000050.html +18 -0
  165. data/doc/classes/El4r/ELSequence.src/M000051.html +20 -0
  166. data/doc/classes/El4r/ELSequence.src/M000052.html +19 -0
  167. data/doc/classes/El4r/ELSequence.src/M000053.html +18 -0
  168. data/doc/classes/El4r/ELSequence.src/M000054.html +18 -0
  169. data/doc/classes/El4r/ELSequence.src/M000055.html +20 -0
  170. data/doc/classes/El4r/ELSequence.src/M000056.html +19 -0
  171. data/doc/classes/El4r/ELSequence.src/M000057.html +18 -0
  172. data/doc/classes/El4r/ELSequence.src/M000058.html +19 -0
  173. data/doc/classes/El4r/ELVariables.html +173 -0
  174. data/doc/classes/El4r/ELVariables.src/M000037.html +18 -0
  175. data/doc/classes/El4r/ELVariables.src/M000038.html +18 -0
  176. data/doc/classes/El4r/ELVariables.src/M000039.html +18 -0
  177. data/doc/classes/El4r/ELVariables.src/M000040.html +23 -0
  178. data/doc/classes/El4r/ELVariables.src/M000045.html +18 -0
  179. data/doc/classes/El4r/ELVariables.src/M000046.html +18 -0
  180. data/doc/classes/El4r/ELVariables.src/M000047.html +18 -0
  181. data/doc/classes/El4r/ELVariables.src/M000048.html +18 -0
  182. data/doc/classes/El4r/ELVariables.src/M000049.html +23 -0
  183. data/doc/classes/El4r/ELVariables.src/M000051.html +18 -0
  184. data/doc/classes/El4r/ELVariables.src/M000052.html +18 -0
  185. data/doc/classes/El4r/ELVariables.src/M000053.html +23 -0
  186. data/doc/classes/El4r/ELVector.html +160 -0
  187. data/doc/classes/El4r/ELVector.src/M000028.html +22 -0
  188. data/doc/classes/El4r/ELVector.src/M000029.html +22 -0
  189. data/doc/classes/El4r/ELVector.src/M000030.html +16 -0
  190. data/doc/classes/El4r/ELVector.src/M000033.html +22 -0
  191. data/doc/classes/El4r/ELVector.src/M000034.html +16 -0
  192. data/doc/classes/El4r/ELVector.src/M000035.html +22 -0
  193. data/doc/classes/El4r/ELVector.src/M000036.html +16 -0
  194. data/doc/classes/El4r/ELVector.src/M000039.html +22 -0
  195. data/doc/classes/El4r/ELVector.src/M000040.html +16 -0
  196. data/doc/classes/El4r/El4rOutput.html +175 -0
  197. data/doc/classes/El4r/El4rOutput.src/M000080.html +18 -0
  198. data/doc/classes/El4r/El4rOutput.src/M000081.html +21 -0
  199. data/doc/classes/El4r/El4rOutput.src/M000088.html +18 -0
  200. data/doc/classes/El4r/El4rOutput.src/M000089.html +21 -0
  201. data/doc/classes/El4r/El4rOutput.src/M000090.html +18 -0
  202. data/doc/classes/El4r/El4rOutput.src/M000091.html +21 -0
  203. data/doc/classes/El4r/El4rOutput.src/M000092.html +18 -0
  204. data/doc/classes/El4r/El4rOutput.src/M000094.html +18 -0
  205. data/doc/classes/El4r/El4rOutput.src/M000095.html +21 -0
  206. data/doc/classes/El4r/El4rOutput.src/M000096.html +18 -0
  207. data/doc/classes/El4rAccessor.html +134 -0
  208. data/doc/classes/El4rAccessor.src/M000005.html +18 -0
  209. data/doc/classes/ElApp.html +211 -0
  210. data/doc/classes/ElApp.src/M000001.html +21 -0
  211. data/doc/classes/ElApp.src/M000002.html +17 -0
  212. data/doc/classes/ElApp.src/M000003.html +18 -0
  213. data/doc/classes/ElApp.src/M000004.html +18 -0
  214. data/doc/classes/ElMixin.html +163 -0
  215. data/doc/classes/ElMixin.src/M000001.html +19 -0
  216. data/doc/classes/ElMixin.src/M000002.html +19 -0
  217. data/doc/classes/ElMixin.src/M000003.html +18 -0
  218. data/doc/classes/ElMixin.src/M000004.html +18 -0
  219. data/doc/classes/ElMixin.src/M000006.html +19 -0
  220. data/doc/classes/ElMixin.src/M000007.html +18 -0
  221. data/doc/created.rid +1 -0
  222. data/doc/files/bin/el4r-instance.html +119 -0
  223. data/doc/fr_class_index.html +40 -0
  224. data/doc/fr_file_index.html +27 -0
  225. data/doc/fr_method_index.html +129 -0
  226. data/doc/index.html +24 -0
  227. data/doc/rdoc-style.css +208 -0
  228. data/el4r.en.html +468 -0
  229. data/el4r.ja.html +640 -0
  230. data/files +29 -0
  231. data/lib/el4r/el4r-sub.rb +1023 -0
  232. data/lib/el4r/emacsruby/autoload/70el4r-mode.rb +9 -0
  233. data/lib/el4r/emacsruby/el4r-mode.rb +35 -0
  234. data/lib/el4r/emacsruby/stdlib.rb +37 -0
  235. data/lib/el4r/exec-el4r.rb +182 -0
  236. data/man/el4r.1 +125 -0
  237. data/setup.rb +1551 -0
  238. data/testing/alltest.rb +5 -0
  239. data/testing/badcase.rb +50 -0
  240. data/testing/el4r.e +262 -0
  241. data/testing/euc.txt +1 -0
  242. data/testing/jis.txt +1 -0
  243. data/testing/sjis.txt +1 -0
  244. data/testing/test-el4r.rb +1053 -0
  245. data/testing/test-gc.rb +81 -0
  246. data/testing/test.el +16 -0
  247. data/testing/test.rb +97 -0
  248. data/testing/utf8.txt +1 -0
  249. metadata +311 -0
@@ -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
+
@@ -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)