Skip to content

feat: from import (PR2: from x import y [as w])#134

Open
ryuichi1208 wants to merge 3 commits into
feat/namespaced-importsfrom
feat/from-import
Open

feat: from import (PR2: from x import y [as w])#134
ryuichi1208 wants to merge 3 commits into
feat/namespaced-importsfrom
feat/from-import

Conversation

@ryuichi1208

Copy link
Copy Markdown
Member

概要

Python 風 import の PR2 / 全3 PRfrom x import y [as w] で選択シンボルを取り込み、修飾なしで呼べるようにする。

  • from math_lib import addadd(...) と修飾なし呼び出し
  • from math_lib import add, mul as m → 複数取り込み・as 別名
  • ローカル関数・ビルトイン・重複 import 名との衝突を検出

ベースは PR1 (#133)。 PR1 がマージされてから本 PR をマージする想定(base を feat/namespaced-imports にしている)。

設計の要点

  • lexer に KW_FROM を追加。parser は from IDENT import IDENT [as IDENT] {, ...}Import.names(name, alias) のリスト)に詰める。
  • sema はモジュールごとに from_env: Dict[localname, (module, name)] を構築し、修飾なし呼び出しを from_env 優先で解決。衝突(ローカル関数 / ビルトイン / 重複)を import 位置で検出。
  • irgen は無改変: 解決は PR1 で導入した call_resolution を通り、同じ rw_user_<module>_<name> シンボルを呼ぶだけ。

変更ファイル

レイヤー ファイル 変更
lexer rwc/lexer.py KW_FROM
parser rwc/parser.py _parse_from_import / _parse_import_name
sema rwc/sema.py _build_from_env_resolve_user_func の修飾なし経路
examples/tests examples/import_from.rw, tests/* e2e + 単体

Test plan

  • 単体 + e2e = 243 全緑uv run pytest -q、PR1 比 +10)
  • e2e: import_from.rwfrom import_basic_lib import add, mul as times)を実行し 5\n20\n
  • emit-ir で修飾なし/別名呼び出しが rw_user_import_basic_lib_add 等に解決されることを確認
  • ネガティブ: 存在しないモジュール / 未定義シンボル / ローカル衝突 / ビルトイン衝突 → 位置付きエラー

Non-Goals

ワイルドカード from x import * / 再エクスポート / 型エイリアスの import。import x as m は PR3。

🤖 Generated with Claude Code

ryuichi1208 and others added 3 commits June 22, 2026 12:44
Add KW_FROM keyword and parse from-imports into Import.names as a list
of (name, alias) pairs. Sema resolution lands in the next commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Build a per-module from_env (local name -> (module, name)) and resolve
unqualified calls against it. Detect collisions with local functions,
builtins, and duplicate imported names. irgen is unchanged: resolution
flows through call_resolution as before.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
examples/import_from.rw exercises `from x import a, b as c` against the
existing import_basic_lib. Add it to the e2e parametrize list plus a
lexer test for the `from` keyword.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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

Successfully merging this pull request may close these issues.

1 participant