Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ネストした関数 #11

Open
nomaddo opened this issue Jan 10, 2017 · 1 comment
Open

ネストした関数 #11

nomaddo opened this issue Jan 10, 2017 · 1 comment

Comments

@nomaddo
Copy link
Collaborator

nomaddo commented Jan 10, 2017

def f() {
  def g(x) {
    print(x);
  }
  g(12);
}
f();

コレを実行するとException in thread "main" com.github.kmizu.nub.NubRuntimeException: function gis not definedで実行時エラーに落ちます。
これはトップレベルの関数はEvaluator.javaにおいてトップレベルにある関数はevaluateメソッドにより関数の環境であるfunctionsに保存されるのですが、それ以外は無視してvisitDefFunctionメソッドはnullを返すためです。

デザインの問題なので

  • トップレベルしか関数定義を許さないようにパーサーを変更する
  • より広い範囲の定義をトラバースしてローカルな関数定義を許す

くらいの解決策をが思い浮かびます。

@kmizu
Copy link
Owner

kmizu commented Jan 10, 2017

実装がトップレベルの関数をなめて関数の環境に保存している実装になっている辺りからわかるかもしれませんが、そもそもネストした関数は実装する予定はありませんでした。パーザが許してるので実行時エラーになっちゃってるという問題です。

パーザの中ではトップレベルと関数の中を区別しないように定義するとシンプルなので現状そうなっている感じです。そして、パーザをこれ以上複雑にはしたくないので、ネストした関数はevalする前にチェックして排除するのが落とし所かなあと思っています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants