2017-08-03 14 views
7

Wygląda na to, że większość (jeśli nie wszystkie) globalne declarations nie może być odwrócone w standardowy sposób ANSI CL.Jak cofnąć deklarację `declaration`?

przykład raz ocenić (bezpośrednio lub poprzez wczytanie pliku) formularz jak (proclaim '(declaration my-decl)) lub (declaim (special *my-var*)) nie ma przenośny sposób, aby (declare (my-decl ...)) nielegalnych lub *my-var* leksykalny.

Różne implementacje oferują niemobilny sposób przywrócenia deklaracji special, zwykle poprzez (proclaim '(notspecial *my-var*)) lub inną sztuczkę.

Co powiecie na declarationproclamation?

W jaki sposób różne implementacje można cofnąć? Jak mógłbyś to wdrożyć? Czy uważasz, że (proclaim '(notdeclaration my-decl)) to dobry pomysł?

Motywacja: w zestaw testów, byłoby miło być modułowy - aby móc przywrócić wszystkie skutki sprawozdania z badań, aby uniknąć ewentualnych zakłóceń w części zestawu testowego. Wiem, że to motywacja na tydzień, ponieważ The Right Way to użycie packages.

+0

Hmm. Co się stanie, jeśli rozwiążesz symbol zmiennej? To prawdopodobnie byłby zły pomysł, ponieważ zepsuje każdą granicę między starymi/nowymi odniesieniami do symbolu –

+0

Nie widzę żadnego właściwego sposobu, aby to zrobić w SBCL, ale wygląda na to, że '(setf (sb-int: info : declaration: uznana nazwa-of-the-declaration) nil) 'zrobiłby to. – jkiiski

Odpowiedz

1

Jednym ze sposobów jest zapewnienie mechanizmu transakcji (wycofanie/zatwierdzenie). To jest wzięte z Xach za Naggum za archive:

Tęsknię siłownia transakcji, gdzie mogę zrobić szereg zmian
do systemu, które są widoczne tylko do mojego wątku o
środowiska wykonawczego wielowątkowych, a następnie odrzucić je lub zatwierdzić je wszystkie raz pod numerem
. Np. Ładowanie pliku może być taką transkacją. Sygnalizacja
błąd podczas ładowania może spowodować cały obrót operacji, który poprzednio został odrzucony zamiast pozostawienia systemu w częściowo zmodyfikowanym stanie. Nie jest to możliwe do zbudowania na istniejącym systemie, ale wymaga to dużego wysiłku, więc jest to coś, co powinni zrobić programiści systemów Common Lisp.

Będziesz przegap możliwość cofnąć tylko podzbiór deklaracji, jak (declare A), (declare B), (undeclare A) ale biorąc pod uwagę motywację, to nie byłoby problemu, ponieważ jest prawdopodobne, aby chciał cofnąć wszystkie możliwe oświadczenia złożone w czasie Badanie.

Możesz dostarczyć specjalny formularz do indywidualnych zgłoszeń "undeclare". Nazwałbym to wycofać, ale może to być trudne do określenia w niektórych przypadkach. Załóżmy, że deklarujesz, że x jest ciągiem lub liczbą, czy możesz wycofać deklarację, która mówi, że x jest ciągiem znaków? A co z funkcjami wbudowanymi, itp.? Transakcja wygląda na łatwiejszą do wdrożenia, np. tymczasowe środowisko.

+0

Pytałem o składnię, która ujawniłaby mechanizm, ale podejście transakcyjne jest rzeczywiście interesujące. – sds

+0

@sds Dla składni wolałabym mieć '(declaim (nie X))' z X dowolne poprawne wyrażenie deklaracji niż inny symbol 'notdeclaration' dla każdej ważnej' deklaracji'. Również 'not' może być mylące:' (deklaruj (nie (typ T X))) zazwyczaj nie jest takie samo jak '(deklaruj (typ (nie T) X))'. Prolog ma wbudowane 'assert' i' retrow ', być może '(deklaracja wycofania) byłoby lepsze. – coredump