Class: Elisp2any::Expression
- Inherits:
-
Object
- Object
- Elisp2any::Expression
- Defined in:
- lib/elisp2any/expression.rb
Class Method Summary collapse
Instance Method Summary collapse
- #deconstruct ⇒ Object
- #deconstruct_keys(*keys) ⇒ Object
-
#initialize(content) ⇒ Expression
constructor
A new instance of Expression.
- #source ⇒ Object
Constructor Details
#initialize(content) ⇒ Expression
Returns a new instance of Expression.
86 87 88 |
# File 'lib/elisp2any/expression.rb', line 86 def initialize(content) @content = content end |
Class Method Details
.scan(scanner) ⇒ Object
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/elisp2any/expression.rb', line 5 def self.scan(scanner) scanner = StringScanner.new(scanner) unless scanner.respond_to?(:skip) if scanner.skip("(") exps = [] while (exp = scan(scanner)) exps << exp spaces = scanner.scan(/[ \n]+/) exps << spaces if spaces end scanner.skip(")") or raise Error, scanner.inspect new(exps) elsif scanner.skip("'") exp = scan(scanner) or raise Error, scanner.inspect new({ quoted: exp }) elsif scanner.skip("\"") content = +"" while !scanner.eos? && !scanner.match?("\\") && !scanner.match?('"') content << scanner.getch end scanner.skip('"') or raise Error, scanner.inspect new(content) elsif scanner.skip("#'") exp = scan(scanner) or raise Error, scanner.inspect new({ function: exp }) else name = scanner.scan(/[a-z0-9_?.:-]+/) or return new(name.to_sym) end end |
.source(arg) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/elisp2any/expression.rb', line 52 def self.source(arg) case arg in Symbol arg.to_s in Array result = +"(" arg.sum { |ele| result << source(ele) } "#{result})" in Expression arg.source in String arg else raise arg.inspect end end |
Instance Method Details
#deconstruct ⇒ Object
82 83 84 |
# File 'lib/elisp2any/expression.rb', line 82 def deconstruct [*@content] end |
#deconstruct_keys(*keys) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/elisp2any/expression.rb', line 69 def deconstruct_keys(*keys) result = {} keys => [keys] keys.each do |key| case key in :content result[:content] = @content else # nop end end result end |
#source ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/elisp2any/expression.rb', line 35 def source case @content in { quoted: } "'#{self.class.source(quoted)}" in String @content in { function: } "#'#{self.class.source(function)}" in Array result = +"(" @content.each { |exp| result << self.class.source(exp) } "#{result})" in Symbol @content.to_s end end |