import re
def read_sexpression(text):
if type(text) is not str or len(text) > 4096:
raise ValueError("sexpr.input")
stack, result, count = [], None, 0
for match in re.finditer(r"\(|\)|[^\s()]+", text):
token = match[0]
if token == "(":
if len(stack) == 16 or (not stack and result is not None):
raise ValueError("sexpr.depth")
item = []
if stack:
stack[-1].append(item)
stack.append(item)
count += 1
elif token == ")":
if not stack:
raise ValueError("sexpr.close")
item = stack.pop()
if not stack:
result = item
else:
if not stack or re.fullmatch(r"[A-Za-z_][A-Za-z0-9_-]*|[+-]?[0-9]+", token) is None:
raise ValueError("sexpr.atom")
stack[-1].append(token)
count += 1
if count > 1024:
raise ValueError("sexpr.nodes")
if stack or result is None:
raise ValueError("sexpr.unclosed")
return result
モデル
OpenAI互換またはAnthropicのエンドポイントを、ベースURLと必要なAPIキーで設定し、接続をテストします。ローカルのモデルサーバーは起動が必要です。リモートツールは別途データを送信する場合があります。
プロジェクト
空リスト、深さ16、1024ノードを試し、何も実行せずに余分な式、閉じていないリスト、未対応の引用構文を拒否します。
適用前に確認
実際の動作を期待する結果と比較します。検証に失敗した場合は、次の変更を加える前に原因を調べてください。
import re
def read_sexpression(text):
if type(text) is not str or len(text) > 4096:
raise ValueError("sexpr.input")
stack, result, count = [], None, 0
for match in re.finditer(r"\(|\)|[^\s()]+", text):
token = match[0]
if token == "(":
if len(stack) == 16 or (not stack and result is not None):
raise ValueError("sexpr.depth")
item = []
if stack:
stack[-1].append(item)
stack.append(item)
count += 1
elif token == ")":
if not stack:
raise ValueError("sexpr.close")
item = stack.pop()
if not stack:
result = item
else:
if not stack or re.fullmatch(r"[A-Za-z_][A-Za-z0-9_-]*|[+-]?[0-9]+", token) is None:
raise ValueError("sexpr.atom")
stack[-1].append(token)
count += 1
if count > 1024:
raise ValueError("sexpr.nodes")
if stack or result is None:
raise ValueError("sexpr.unclosed")
return result
パーサーを変えても小さな言語の範囲を保つ
ParenWickは、受理する入力を意図的に限定したパーサーを開発するWindows向けAIコーディング環境です。プロジェクトを開き、認識すべき言語と、どこで処理を止めるかを説明してください。実装上の都合で言語が暗黙に広がらないよう、修正案の前に現行のパーサーと利用側を接続したアシスタントに調べてもらいます。
制限付きS式リーダーが具体例です。括弧で囲まれた単一の式、許可するアトム構文、入れ子リストの表現を検討します。深さとノード数の上限、最初の式の後に別の式が続く場合の動作も依頼に含めてください。パーサーは入力の表現を返し、それを解釈する処理はアプリケーションの別の部分になります。
受理・拒否の両方の例で提案をレビューし、ちょうど上限と上限を超えるケースで検証してください。呼び出し側が不正入力と有効な空リストを区別できるよう、成功出力と同じ慎重さでエラー処理を確認します。ParenWickは対応するOpenAI互換またはAnthropicの接続を受け付け、必要なら認証情報を使います。提供されれば制限のないモデルを選び、サーバーのコンテキストとツール対応を確認してください。一つの式でもっともらしく動くだけでなく、文法に照らして説明できる修正にします。
パーサーの変更と境界
有効な例のほかに何を示すべきですか?
拒否する例、許可するアトム構文、サイズ・深さ・ノード数の明示的な上限を提示し、エラーが呼び出し側へ届く方法も示してください。修正案が意図した言語の境界を保つかレビューできます。
式を読むと内容が実行されますか?
例の作業は入力をリストとアトムの文字列に解析し、その表現を評価しません。実行や解釈は別途指定した動作として扱い、解析済み入力を何らかの操作へ結び付ける前に後続コードを確認してください。
二つ目のトップレベルの式はどう扱いますか?
既存の仕様は括弧付きの式を一つ受理し、追加の式を拒否します。二つの式を含む例で入力全体が考慮されるか確認し、有効な接頭部分だけ受け付けて残りを無視する変更を防いでください。
入れ子の上限ちょうどをテストする理由は?
最大の受理構造と最初に拒否する構造を区別し、1ずれの変更を検出できます。ノード数と入力長でも同様に行い、拒否時に呼び出すアプリケーションの期待する応答が返るか確認してください。
ParenWick · 更新日 2026-10-25