Semplificare il comune Lisp go
in altre lingue goto
è, beh, troppo semplificazione.
In Common Lisp, go
è possibile scaricare lo stack. Per esempio:
(tagbody
(mapC#'(lambda (el1 el2)
(format t "el1: ~a, el2: ~a~%" el1 el2)
(when (or (null el1) (null el2))
(go stop)))
list1
list2)
stop)
Se stai attuazione Common Lisp in termini di C, quindi un non-svolgimento go
può essere un normale goto
, ma svolgersi go
richiede setjmp
/longjmp
o equivalente funzionalità, con una corretta pila svolgimento , seguito da un normale goto
se necessario, vale a dire nel caso in cui il modulo Lisp con tag non sia l'istruzione o l'espressione C dopo setjmp
.
Probabilmente vorrete usare la gestione delle eccezioni del sistema operativo, se potete permettervi di estenderlo. Potrebbe essere più vantaggioso se in un secondo momento si desidera integrare le funzionalità di altri linguaggi, ad esempio le eccezioni C++, e la piattaforma potrebbe già disporre di una serie di gestori, eseguendo automaticamente i moduli di pulizia unwind-protect
fino a un determinato stack frame.
Se si desidera mantenere portatile con il minimo sforzo, è possibile gestire uno stack thread-local di setjmp
contesti in cui si longjmp
alla più recente contesto con informazioni sufficienti per tenere longjmp
ing fino al giusto contesto, in esecuzione unwind-protect
pulita -up forme in tutto. In questo modo, è possibile continuare a utilizzare le funzionalità di gestione delle eccezioni della piattaforma, ma solo per impostare i telegrammi di srotolamento da/a chiamate esterne.