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
data/CHANGELOG
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
== 1.1.0 / 2011-01-05
|
2
|
+
|
3
|
+
* 2 major enhancements
|
4
|
+
* Multiple ruby slaves can be run from Emacs at once.
|
5
|
+
* The method_missing stuff now retreives and sets elisp variables in
|
6
|
+
addition to calling functions.
|
7
|
+
* Ruby slaves can call elisp while starting up.
|
8
|
+
* minor enhancements
|
9
|
+
* Less temporary variables created in elisp, and those that can be
|
10
|
+
are `makunbound'ed when they can be.
|
11
|
+
* Eval used in fewer places in ruby and elisp.
|
12
|
+
* New and better examples.
|
13
|
+
* Code is DRYer, prettier and sucks less in general.
|
14
|
+
|
1
15
|
== 1.0.1 / 2009-09-09
|
2
16
|
|
3
17
|
* 1 tiny backwards-incompatible enhancement
|
data/README
CHANGED
@@ -8,8 +8,7 @@ Emacs is great. So is Ruby. This purpose of this library is to:
|
|
8
8
|
* manipulate Emacs without using Elisp to some extent (Ruby wrappers
|
9
9
|
around some Elisp functions and objects)
|
10
10
|
* reduce the number of blog entries titled "Is Ruby an acceptable
|
11
|
-
lisp?"
|
12
|
-
vs. haskell vs. ..."
|
11
|
+
lisp?"
|
13
12
|
|
14
13
|
== Install
|
15
14
|
|
@@ -18,13 +17,15 @@ Emacs is great. So is Ruby. This purpose of this library is to:
|
|
18
17
|
Then the library is installed, and you can call elisp from ruby. But
|
19
18
|
if you want to call ruby from emacs (and you do, right?) you need to
|
20
19
|
go into the +src+ directory and copy <tt>relisp.el</tt> and/or
|
21
|
-
<tt>relisp.elc</tt> to your elisp folder (probably <tt>~/.elisp</tt>
|
22
|
-
Then you might want to add the
|
20
|
+
<tt>relisp.elc</tt> to your elisp folder (probably <tt>~/.elisp</tt>
|
21
|
+
or <tt>~/.emacs.d/site-lisp</tt>). Then you might want to add the
|
22
|
+
lines
|
23
23
|
|
24
24
|
(autoload 'relisp-start-slave "relisp" nil t)
|
25
25
|
(autoload 'ruby-eval "relisp" nil t)
|
26
26
|
|
27
|
-
to your emacs initialization file (
|
27
|
+
to your emacs initialization file (<tt>~/.emacs'</tt> or
|
28
|
+
<tt>~/.emacs.d/init.el</tt>).
|
28
29
|
|
29
30
|
If you don't know where to find the files for this gem, run the
|
30
31
|
command <tt>gem env gemdir</tt>. Or you can download the tarball for
|
@@ -32,8 +33,8 @@ this gem and get the files there.
|
|
32
33
|
|
33
34
|
== Usage
|
34
35
|
|
35
|
-
The stuff below is all in the +examples+ directory if
|
36
|
-
running it.
|
36
|
+
The stuff below and a lot more is all in the +examples+ directory if
|
37
|
+
you want to try running it.
|
37
38
|
|
38
39
|
=== Emacs calling Ruby
|
39
40
|
|
@@ -52,19 +53,17 @@ Then make calls to ruby with <tt>ruby_eval</tt>:
|
|
52
53
|
(type-of (ruby-eval "{:name => 'john'}"))
|
53
54
|
=> hash-table
|
54
55
|
|
55
|
-
If you need to use an elisp variable
|
56
|
-
|
57
|
-
evaluated by ruby, is equal to the original elisp object. For example:
|
56
|
+
If you need to use the value of an elisp variable,
|
57
|
+
<tt>method_missing</tt> will give it to you:
|
58
58
|
|
59
|
-
(setq
|
60
|
-
(ruby-eval
|
61
|
-
|
62
|
-
(
|
63
|
-
|
64
|
-
(ruby-eval
|
65
|
-
|
66
|
-
(
|
67
|
-
=> vector
|
59
|
+
(setq list '(3 5 2 6 4 1))
|
60
|
+
(ruby-eval "list = symbol_value(:list)")
|
61
|
+
|
62
|
+
(setq elisp-vector [1 2 3 4 5 6])
|
63
|
+
(ruby-eval "vect = symbol_value(:\"elisp-vector\")")
|
64
|
+
(ruby-eval "vect = self.elisp_vector")
|
65
|
+
; or even
|
66
|
+
(ruby-eval "vect = elisp_vector")
|
68
67
|
|
69
68
|
Note that the data types/classes are correct in both languages. The
|
70
69
|
results are converted--it's not just strings getting passed back and
|
@@ -147,12 +146,13 @@ use the <tt>ElispSlave#debugging</tt> method:
|
|
147
146
|
|
148
147
|
== Author
|
149
148
|
|
150
|
-
<don@ohspite.net>
|
149
|
+
Don March <don@ohspite.net>
|
151
150
|
|
152
151
|
== Copyright
|
153
152
|
|
154
|
-
Copyright (C) 2009
|
155
|
-
|
153
|
+
Copyright (C) 2009, 2010 Don March.
|
154
|
+
|
155
|
+
Licensed under the GNU General Public License.
|
156
156
|
|
157
157
|
Relisp is free software: you can redistribute it and/or modify it
|
158
158
|
under the terms of the GNU General Public License as published by
|
data/Rakefile
CHANGED
@@ -31,13 +31,14 @@ Wait! You're not finished!
|
|
31
31
|
The gem is installed, and you can now call elisp from ruby. But if
|
32
32
|
you want to call ruby from emacs (and you do, right?) you need to go
|
33
33
|
into the 'src' directory of this gem and copy 'relisp.el' and/or
|
34
|
-
'relisp.elc' to your elisp folder (probably
|
35
|
-
might want to add the
|
34
|
+
'relisp.elc' to your elisp folder (probably something like
|
35
|
+
'~/.emacs.d/site-lisp' or '~/.elisp'). Then you might want to add the
|
36
|
+
lines
|
36
37
|
|
37
38
|
(autoload 'relisp-start-slave "relisp" nil t)
|
38
39
|
(autoload 'ruby-eval "relisp" nil t)
|
39
40
|
|
40
|
-
to your emacs initialization file (
|
41
|
+
to your emacs initialization file ('~/.emacs' or ~/.emacs.d/init.el).
|
41
42
|
|
42
43
|
If you don't know where to find the files for this gem, run the
|
43
44
|
command "gem env gemdir". Or you can download the tarball for this
|
@@ -1,49 +1,85 @@
|
|
1
|
-
;;
|
2
|
-
;;
|
1
|
+
;; You might want to look at the *Relisp* buffer to see what messages
|
2
|
+
;; are being passed. Or you might not. But it's there if you want it.
|
3
3
|
|
4
|
-
|
4
|
+
;; To evaluate each examples below, move point after the closing
|
5
|
+
;; parenthesis and press C-x C-e.
|
5
6
|
|
6
|
-
|
7
|
-
|
7
|
+
;; This is how to start the ruby slave without a file, but if you
|
8
|
+
;; don't `ruby-eval' and `ruby-exec' will start one for you.
|
9
|
+
;; This stops the old slave first:
|
10
|
+
(relisp-start-slave)
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
(
|
12
|
-
|
13
|
-
(ruby-exec "sample_ruby_method4")
|
12
|
+
;; Note that return values are not strings but actual elisp data
|
13
|
+
;; types:
|
14
|
+
(ruby-eval "1 + 2 + 3")
|
15
|
+
(ruby-eval "'gnirts ybur'.reverse")
|
14
16
|
|
15
|
-
;;
|
16
|
-
|
17
|
+
;; Variable persistence between calls:
|
18
|
+
(ruby-exec "a = 5")
|
19
|
+
(ruby-eval "a + 1")
|
17
20
|
|
18
|
-
|
21
|
+
;; Recursive calls:
|
22
|
+
(ruby-eval "elisp_eval('(+ 1 2)')")
|
23
|
+
(ruby-eval "elisp_eval('(ruby-eval \"1 + 2\")')")
|
19
24
|
|
20
|
-
|
21
|
-
|
22
|
-
(ruby-eval "
|
23
|
-
(ruby-eval "
|
25
|
+
(setq list '(3 5 2 6 4 1))
|
26
|
+
(ruby-eval "list = symbol_value(:list)")
|
27
|
+
(ruby-eval "list.class")
|
28
|
+
(ruby-eval "list.to_list.class")
|
29
|
+
(ruby-eval "list.to_list.sort")
|
30
|
+
(type-of (ruby-eval "list.to_list"))
|
24
31
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
(type-of (ruby-eval (concat (relisp-to-ruby vect) ".reverse")))
|
32
|
+
;; Because of the method_missing stuff, getting the symbol value
|
33
|
+
;; directly isn't even necessary most of the time (it was for `list',
|
34
|
+
;; however, because it's a function and method_missing tries that
|
35
|
+
;; first.
|
30
36
|
|
31
|
-
(setq
|
32
|
-
(ruby-eval
|
33
|
-
(ruby-eval
|
34
|
-
|
35
|
-
(
|
37
|
+
(setq elisp-vector [1 2 3 4 5 6])
|
38
|
+
;; (ruby-eval "vect = symbol_value(:\"elisp-vector\")")
|
39
|
+
(ruby-eval "vect = self.elisp_vector")
|
40
|
+
;; or even
|
41
|
+
(ruby-eval "vect = elisp_vector")
|
42
|
+
(ruby-eval "vect.class")
|
43
|
+
(ruby-eval "vect.kind_of? Array")
|
44
|
+
(ruby-eval "vect.reverse")
|
45
|
+
(type-of (ruby-eval "vect.reverse"))
|
46
|
+
(ruby-eval "self.elisp_vector= vect.reverse")
|
47
|
+
(symbol-value 'elisp-vector)
|
36
48
|
|
37
49
|
(setq str "a couple of words")
|
38
|
-
(ruby-eval
|
50
|
+
(ruby-eval "self.str.split")
|
39
51
|
|
40
|
-
|
41
|
-
|
42
|
-
(ruby-
|
52
|
+
; If you need an elisp value in ruby but don't want it in an elisp
|
53
|
+
; variable, just elisp_eval it:
|
54
|
+
(ruby-exec "vect = elisp_eval '[1 2 3 4]'")
|
55
|
+
(ruby-eval "vect.reverse")
|
43
56
|
|
44
|
-
;;
|
45
|
-
|
46
|
-
(ruby-eval "a + 1")
|
57
|
+
;; Running multiple slaves is possible by specifying `t' as a an
|
58
|
+
;; optional second argument to `relisp-start-slave'.
|
47
59
|
|
60
|
+
;; This stops the old slave first:
|
61
|
+
(setq p1 (relisp-start-slave))
|
62
|
+
;; This doesn't:
|
63
|
+
(setq p2 (relisp-start-slave nil t))
|
64
|
+
(ruby-exec "p=1" p1)
|
65
|
+
(ruby-exec "p=2" p2)
|
66
|
+
(ruby-eval "p" p1)
|
67
|
+
(ruby-eval "p" p2)
|
68
|
+
(relisp-stop-slave p1)
|
69
|
+
(relisp-slave-alive-p p1)
|
70
|
+
(relisp-stop-slave p2)
|
48
71
|
|
72
|
+
;; How to specify a file when running the slave. This ruby file runs
|
73
|
+
;; some window stuff and then exits, i.e., it doesn't turn itself into
|
74
|
+
;; a slave.
|
75
|
+
(setq p (relisp-start-slave "ruby_slave2.rb"))
|
76
|
+
(relisp-slave-alive-p p)
|
49
77
|
|
78
|
+
;; This ruby file defines some methods, runs some frame stuff at
|
79
|
+
;; startup, and then starts itself as a slave.
|
80
|
+
(setq p (relisp-start-slave "ruby_slave.rb"))
|
81
|
+
(relisp-slave-alive-p p)
|
82
|
+
(ruby-exec "kill_the_new_buffer")
|
83
|
+
(ruby-eval "ruby_elisp_eval")
|
84
|
+
(ruby-eval "ruby_elisp_eval_ruby_eval")
|
85
|
+
(ruby-exec "frame_class")
|
@@ -0,0 +1,37 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../lib")
|
2
|
+
require 'relisp'
|
3
|
+
|
4
|
+
slave = Relisp::RubySlave.new
|
5
|
+
|
6
|
+
def kill_the_new_buffer
|
7
|
+
switch_to_buffer('*relisp_test_buffer*')
|
8
|
+
kill_buffer
|
9
|
+
end
|
10
|
+
|
11
|
+
def ruby_elisp_eval
|
12
|
+
elisp_eval("(+ 1 5)")
|
13
|
+
end
|
14
|
+
|
15
|
+
def ruby_elisp_eval_ruby_eval
|
16
|
+
elisp_eval('(ruby-eval "(1 + 5)")')
|
17
|
+
end
|
18
|
+
|
19
|
+
def frame_class
|
20
|
+
frame = Relisp::Frame.new({:width => 80, :height => 20, :name => "ruby frame"})
|
21
|
+
frame.height=30
|
22
|
+
frame.width=60
|
23
|
+
10.times { frame.width += 2 }
|
24
|
+
10.times { frame.width -= 2 }
|
25
|
+
10.times { frame.height += 2 }
|
26
|
+
10.times { frame.height -= 2 }
|
27
|
+
5.times { frame.height +=2; frame.width += 2 }
|
28
|
+
5.times { frame.height -=2; frame.width -= 2 }
|
29
|
+
frame.delete
|
30
|
+
end
|
31
|
+
|
32
|
+
buffer = Relisp::Buffer.new('*relisp_test_buffer*')
|
33
|
+
slave.display_buffer buffer
|
34
|
+
buffer.insert "This buffer was created by the startup stuff in `ruby_slave.rb\'\n"
|
35
|
+
buffer.insert "It will go away when you run `kill_the_new_buffer'"
|
36
|
+
|
37
|
+
slave.start
|
@@ -0,0 +1,33 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../lib")
|
2
|
+
require 'relisp'
|
3
|
+
|
4
|
+
slave = Relisp::RubySlave.new
|
5
|
+
|
6
|
+
w = slave.selected_window
|
7
|
+
w2 = w.split_vertically
|
8
|
+
w3 = w2.split_horizontally
|
9
|
+
10.times do
|
10
|
+
w.shrink(1)
|
11
|
+
slave.redisplay
|
12
|
+
sleep 0.01
|
13
|
+
end
|
14
|
+
10.times do
|
15
|
+
w.enlarge(1)
|
16
|
+
slave.redisplay
|
17
|
+
sleep 0.01
|
18
|
+
end
|
19
|
+
10.times do
|
20
|
+
w2.shrink(0,1)
|
21
|
+
slave.redisplay
|
22
|
+
sleep 0.01
|
23
|
+
end
|
24
|
+
10.times do
|
25
|
+
w2.enlarge(0,1)
|
26
|
+
slave.redisplay
|
27
|
+
sleep 0.01
|
28
|
+
end
|
29
|
+
|
30
|
+
w2.delete
|
31
|
+
w3.delete
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../lib")
|
4
|
+
|
5
|
+
require 'relisp'
|
6
|
+
|
7
|
+
emacs = Relisp::ElispSlave.new
|
8
|
+
|
9
|
+
puts "elisp_eval '(+ 1 2)'"
|
10
|
+
puts '=> ' + emacs.elisp_eval("(+ 1 2)").to_s
|
11
|
+
puts
|
12
|
+
puts "elisp_exec '(+ 1 2)'"
|
13
|
+
puts '=> ' + emacs.elisp_exec("(+ 1 2)").to_s
|
14
|
+
puts "elisp_exec '(setq a (+ 1 2))'"
|
15
|
+
puts '=> ' + emacs.elisp_exec("(setq a (+ 1 2))").to_s
|
16
|
+
puts "elisp_eval 'a'"
|
17
|
+
puts '=> ' + emacs.elisp_eval("a").to_s
|
18
|
+
|
19
|
+
|
20
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../lib")
|
4
|
+
|
5
|
+
require 'relisp'
|
6
|
+
|
7
|
+
emacs = Relisp::ElispSlave.new
|
8
|
+
|
9
|
+
|
10
|
+
puts 'buffer = Relisp::Buffer.new("ruby-created-buffer"); buffer.to_s'
|
11
|
+
emacs.debugging do
|
12
|
+
@buffer = Relisp::Buffer.new("ruby-created-buffer")
|
13
|
+
end
|
14
|
+
puts '=> ' + @buffer.to_s
|
15
|
+
|
16
|
+
puts
|
17
|
+
|
18
|
+
puts "buffer.insert 'some text'; buffer.to_s"
|
19
|
+
emacs.debugging do
|
20
|
+
@buffer.insert 'some text'
|
21
|
+
end
|
22
|
+
puts '=> ' + @buffer.to_s
|
23
|
+
|
24
|
+
puts
|
25
|
+
puts "Hashes are currently the most complex thing to convert (press Enter to see it):"
|
26
|
+
gets
|
27
|
+
|
28
|
+
ruby_hash = ({ :time => "money",
|
29
|
+
:money => "power" })
|
30
|
+
emacs.debugging do
|
31
|
+
emacs.emacs_hash= ruby_hash
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../lib")
|
4
|
+
|
5
|
+
require 'relisp'
|
6
|
+
|
7
|
+
emacs = Relisp::ElispSlave.new
|
8
|
+
|
9
|
+
puts 'buffer = Relisp::Buffer.new("ruby-created-buffer"); buffer.to_s'
|
10
|
+
buffer = Relisp::Buffer.new("ruby-created-buffer")
|
11
|
+
puts '=> ' + buffer.to_s
|
12
|
+
puts "buffer.insert 'some text'; buffer.to_s"
|
13
|
+
buffer.insert 'some text'
|
14
|
+
puts '=> ' + buffer.to_s
|
15
|
+
puts 'buffer.name'
|
16
|
+
puts '=> ' + buffer.name.to_s
|
17
|
+
puts "buffer.name= 'fred'"
|
18
|
+
puts '=> ' + buffer.name= 'fred'.to_s
|
19
|
+
puts 'buffer.name'
|
20
|
+
puts '=> ' + buffer.name
|
21
|
+
|
22
|
+
puts
|
23
|
+
|
24
|
+
puts 'emacs.create_file_buffer("blah.txt").class'
|
25
|
+
puts '=> ' + emacs.create_file_buffer("blah.txt").class.to_s
|
26
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), "../../lib")
|
4
|
+
|
5
|
+
require 'relisp'
|
6
|
+
|
7
|
+
emacs = Relisp::ElispSlave.new
|
8
|
+
|
9
|
+
puts "emacs.elisp_eval '(concat \"two\" \"words\")"
|
10
|
+
puts '=> ' + (emacs.elisp_eval '(concat "two " "words")')
|
11
|
+
puts "emacs.concat \"two\", \"words\""
|
12
|
+
puts '=> ' + emacs.concat("two ", "words")
|
13
|
+
|
14
|
+
puts
|
15
|
+
|
16
|
+
puts 'emacs.set(:a, 3); emacs.symbol_value(:a)'
|
17
|
+
emacs.set(:a, 3).to_s
|
18
|
+
puts '=> ' + emacs.symbol_value(:a).to_s
|
19
|
+
puts 'emacs.a'
|
20
|
+
puts '=> ' + emacs.a.to_s
|
21
|
+
puts 'emacs.a= 5; emacs.a'
|
22
|
+
emacs.a= 5
|
23
|
+
puts '=> ' + emacs.a.to_s
|
24
|
+
|
@@ -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
|
#
|
@@ -83,23 +83,40 @@ module Relisp
|
|
83
83
|
|
84
84
|
private
|
85
85
|
|
86
|
-
# Forward any missing method to elisp
|
87
|
-
#
|
88
|
-
#
|
86
|
+
# Forward any missing method to elisp.
|
87
|
+
#
|
88
|
+
# If a function with that name exists, write the rubyized (swap _
|
89
|
+
# for -) function and arguments in prefix notation (calling the
|
90
|
+
# +to_elisp+ method of each of the _args_).
|
91
|
+
#
|
92
|
+
# If a symbol with that name exists, return its value.
|
93
|
+
#
|
94
|
+
# If the last char of the missing method is `=', set the symbol
|
95
|
+
# formed by the characters before the `=' to the first argument.
|
96
|
+
#
|
97
|
+
# For example:
|
98
|
+
#
|
99
|
+
# emacs = Relisp::ElispSlave.new
|
100
|
+
# puts emacs.concat "two", "words"
|
101
|
+
# emacs.a= 5
|
102
|
+
# puts emacs.a
|
89
103
|
#
|
90
104
|
# This automatically allows access to a large portion of elisp
|
91
|
-
#
|
105
|
+
# in a rubyish way.
|
92
106
|
#
|
93
107
|
def method_missing(function, *args) # :doc:
|
94
|
-
|
95
|
-
unless elisp_eval("(functionp '#{function})")
|
96
|
-
raise NameError, "#{function} is not an elisp function"
|
97
|
-
end
|
108
|
+
lisp_name = function.to_s.gsub('_', '-')
|
98
109
|
|
99
|
-
elisp_eval('
|
100
|
-
|
101
|
-
|
102
|
-
|
110
|
+
if elisp_eval "(functionp '#{lisp_name})"
|
111
|
+
elisp_eval "(#{lisp_name} #{args.map{|a| a.to_elisp}.join(' ')})"
|
112
|
+
elsif elisp_eval("(boundp '#{lisp_name})") && args.empty? # if there are args, it was meant to be a function
|
113
|
+
elisp_eval "#{lisp_name}"
|
114
|
+
elsif lisp_name[lisp_name.size-1..lisp_name.size-1] == "="
|
115
|
+
elisp_eval "(setq #{lisp_name[0..lisp_name.size-2]} #{args[0].to_elisp})"
|
116
|
+
else
|
117
|
+
raise NameError, "#{function} is undefined variable/method/function in Ruby and Elisp"
|
118
|
+
end
|
119
|
+
# elisp_eval("(if (functionp '#{function}) (#{function} #{args.map{|a| a.to_elisp}.join(' ')}) #{function})")
|
103
120
|
end
|
104
121
|
|
105
122
|
end
|