pseudo-lang / pseudo

transpile algorithms/libs to idiomatic JS, Go, C#, Ruby
MIT License
685 stars 43 forks source link

Error in converting python list comprehension #12

Closed jzjsuper closed 8 years ago

jzjsuper commented 8 years ago

test.py:

a = [x + 1 for x in [1, 2, 3]]

test.pseudo.yaml:

constants: []
custom_exceptions: []
definitions: []
dependencies: []
main:
- pseudo_type: Void
  target:
    name: a
    pseudo_type: [List, Int]
    type: local
  type: assignment
  value:
    block:
    - left: {name: x, pseudo_type: Int, type: local}
      op: +
      pseudo_type: Int
      right: {pseudo_type: Int, type: int, value: 1}
      type: binary_op
    function: map
    iterators:
      iterator: {name: x, pseudo_type: Int, type: local}
      type: for_iterator
    pseudo_type: [List, Int]
    sequences:
      sequence:
        elements:
        - {pseudo_type: Int, type: int, value: 1}
        - {pseudo_type: Int, type: int, value: 2}
        - {pseudo_type: Int, type: int, value: 3}
        pseudo_type: [List, Int]
        type: list
      type: for_sequence
    type: standard_iterable_call
type: module

When executing $ pseudo test.pseudo.yaml py, the following error occurs:

Traceback (most recent call last):
  File "/usr/local/bin/pseudo", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.5/site-packages/pseudo/main.py", line 43, in main
    output_source = pseudo.generate(pseudo.loader.as_tree(intermediate_code), format)
  File "/usr/local/lib/python3.5/site-packages/pseudo/__init__.py", line 106, in generate
    return GENERATORS[language]().generate(translated_ast)
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 44, in generate
    original = self._generate_node(tree)
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 156, in _generate_node
    return self._generate_from_template(self._parsed_templates[node.type], node, depth)
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 210, in _generate_from_template
    expanded.append(element.expand(self, node, depth))
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator_dsl.py", line 69, in expand
    expanded = [generator._generate_node(content[0], depth)]
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 156, in _generate_node
    return self._generate_from_template(self._parsed_templates[node.type], node, depth)
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 210, in _generate_from_template
    expanded.append(element.expand(self, node, depth))
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator_dsl.py", line 29, in expand
    return generator._generate_node(content, depth)
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 156, in _generate_node
    return self._generate_from_template(self._parsed_templates[node.type], node, depth)
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator.py", line 210, in _generate_from_template
    expanded.append(element.expand(self, node, depth))
  File "/usr/local/lib/python3.5/site-packages/pseudo/code_generator_dsl.py", line 63, in expand
    content = getattr(node, self.field)
AttributeError: 'Node' object has no attribute 'test'
jzjsuper commented 8 years ago

However, if I change test.py to

a = [x + 1 for x in [1, 2, 3] if True]

The program will not throw any exception, but it generates the following python file:

a = [x + 1 for x in [1, 2, 3] if False]
alehander92 commented 8 years ago

Yep, the True / False error is because of the same bug as your previous issue, so that's fixed, the first example is incorrectly compiled to pseudo-ast by pseudo-python, it should convert it to a List#map standard call

alehander92 commented 8 years ago

Fixed in pseudo-python commit71