私が理解しているように、Ruby では、括弧を必要としない関数呼び出しで実行できるトリッキーなことがいくつかあります。
x y
x
Ruby では、それは関数が引数として呼び出される関数呼び出しである可能性がy
あります。
Python には、そのようなトリックはありません。関数を呼び出す場合は、関数名の後に括弧が必要です。ですから、これでゲームをしようとしてもあまり運が良くないと思いますeval()
。
言語を解析して、その言語が何をしようとしているのかを理解するパーサーを作成する方がよいでしょう。そのために、Python には特に優れたライブラリがあります。pyparsing
http://pyparsing.wikispaces.com/
PS「Pythonドメイン固有言語」をGoogleで検索するだけで、いくつかの良いリンクが見つかります。多くはStackOverflowにあります。これが私が見つけた最高のものです:
Python のミニ言語
編集:さて、あなたは例を求めました、そしてここに行きます。これは PyParsing での初めてのプログラムで、非常に簡単でした。ドキュメントも読んでいませんでした。Web で見つけたプレゼンテーションの例から作業を行いました。
プレゼンテーションの URL は次のとおりです: http://www.ptmcg.com/geo/python/confs/TxUnconf2008Pyparsing.html
from pyparsing import *
def give_desired_output(s):
return "desired"
TAKE_THIS = Suppress("take_this") + Suppress(Word(printables))
AND_PROC = Suppress("and_process_it")
AND_GIVE = Keyword("and_give_me_the_output")
AND_GIVE.setParseAction(give_desired_output)
LANGUAGE_LINE = TAKE_THIS | AND_PROC | AND_GIVE
LANGUAGE = ZeroOrMore(LANGUAGE_LINE)
def parse_language(text):
lst = LANGUAGE.parseString(text)
assert len(lst) == 1 # trivial language returns a single value
return lst[0]
if __name__ == "__main__":
from_a_dsl_file = \
"""
take_this 'abc'
and_process_it
and_give_me_the_output
"""
print(parse_language(from_a_dsl_file)) # prints the word: desired