Analisi limitata delle espressioni S
Analizza una sola espressione S tra parentesi di massimo 4096 caratteri in liste e atomi ASCII.
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
Modelli
Configura un endpoint compatibile con OpenAI o Anthropic usando URL di base e chiave API, se necessaria. Prova la connessione. Il server locale deve essere in esecuzione; gli strumenti remoti possono trasmettere dati separatamente.
Progetto
Prova liste vuote, profondità 16 e 1024 nodi, rifiutando forme extra, liste aperte e virgolette non supportate senza valutazione.
Controlla prima di applicare
Confronta il comportamento effettivo con il risultato atteso. Se una verifica fallisce, indaga la causa prima di altre modifiche.
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
Mantieni piccolo un linguaggio mentre cambia il suo parser
ParenWick è un ambiente di programmazione con IA per Windows per sviluppare parser il cui input accettato è deliberatamente vincolato. Apri il progetto e descrivi il linguaggio che l'applicazione deve riconoscere, incluso dove deve fermarsi. Chiedi all'assistente collegato di esaminare il parser attuale e il codice utilizzatore prima di suggerire una modifica, così una comodità d'implementazione non amplia silenziosamente il linguaggio.
Un lettore di espressioni S con limiti definiti offre un esempio concreto. Discuti una singola forma tra parentesi, la sintassi ammessa per gli atomi e come vengono rappresentate le liste annidate. Includi nella richiesta i limiti di profondità e numero di nodi, insieme a cosa succede quando seguono altre forme dopo la prima. Il parser restituisce una rappresentazione dell'input; interpretarla sarebbe una parte separata dell'applicazione.
Esamina la proposta usando insieme casi di prova accettati e rifiutati, poi esegui i controlli del progetto esattamente ai limiti e oltre. Esamina la gestione degli errori con la stessa cura dell'output riuscito, così i chiamanti possono distinguere input malformati da una lista vuota valida. ParenWick accetta connessioni supportate compatibili con OpenAI o Anthropic, con credenziali quando richieste. Scegli un modello senza restrizioni dove offerto e controlla il supporto del server per contesto e strumenti. La modifica risultante deve essere spiegabile rispetto alla grammatica, anziché solo plausibile per una singola espressione di esempio.
Le modifiche al parser e i loro confini
Cosa devo fornire all'assistente oltre agli esempi validi?
Fornisci esempi rifiutati, la sintassi ammessa per gli atomi e limiti espliciti di dimensione, profondità e numero di nodi. Indica come gli errori arrivano al chiamante. Questo permette di verificare se la modifica proposta conserva il confine previsto del linguaggio.
Leggere un'espressione ne esegue i contenuti?
Il compito illustrato analizza l'input trasformandolo in liste e stringhe di atomi. Non valuta quella rappresentazione. Mantieni esecuzione o interpretazione come comportamento specificato separatamente ed esamina il codice a valle prima di collegare l'input analizzato a un'azione.
Come deve comportarsi una seconda forma al livello principale?
Il contratto esistente accetta una forma tra parentesi e rifiuta quelle aggiuntive. Includi un caso di prova con due forme e verifica che sia considerato l'intero input, così una modifica al parser non accetta silenziosamente un prefisso valido ignorando il materiale finale.
Perché verificare esattamente il limite di annidamento?
Distingue la struttura massima accettata dalla prima rifiutata e può rivelare errori di una unità nei limiti. Fai lo stesso per i limiti dei nodi e della lunghezza dell'input, poi verifica che il rifiuto produca la risposta attesa dall'applicazione chiamante.
ParenWick · Aggiornato 2026-10-25