Le parole chiave Lisp possono essere protette?

3

Perché le parole chiave non lisp sono protette?

Ad esempio,

(define a 3)
(define define +) #makes define useless
(define a 1) #outputs 4, instead of assigning 1 to a.

Questa flessibilità è così importante? O anche peggio:

(define + -)
(+ 1 1) #Output 0.

Dove può essere utile e questo comportamento può essere bloccato? AFAIK, tutti i linguaggi di programmazione hanno parole chiave riservate.

    
posta Quora Feans 08.09.2016 - 02:20
fonte

3 risposte

4

In Common Lisp, tutti i simboli nel pacchetto COMMON LISP sono protetti dallo standard. Dice che ridefinire il pacchetto o i simboli nel pacchetto ha conseguenze indefinite. Il che significa che tutto può succedere: niente, il cambiamento è fatto, il programma si blocca, il programma potrebbe incorrere in un errore, ... o anche il sole sorge a ovest il mattino successivo.

Le implementazioni Real Common Lisp spesso avvisano l'utente:

Lispworks:

CL-USER 1 > (defun defun () 3)

Error: Redefining function DEFUN visible from package COMMON-LISP.
  1 (continue) Redefine it anyway.
  2 (abort) Return to level 0.
  3 Restart top-level loop.

SBCL:

* (defun defun () 3)

debugger invoked on a SYMBOL-PACKAGE-LOCKED-ERROR:
  Lock on package COMMON-LISP violated when proclaiming DEFUN as a function
  while in package COMMON-LISP-USER.
See also:
  The SBCL Manual, Node "Package Locks"
  The ANSI Standard, Section 11.1.2.1.2

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE      ] Ignore the package lock.
  1: [IGNORE-ALL    ] Ignore all package locks in the context of this operation.
  2: [UNLOCK-PACKAGE] Unlock the package.
  3: [ABORT         ] Exit debugger, returning to top level.

Dal momento che molte implementazioni di Common Lisp sono in gran parte programmate da sole, è necessario un meccanismo per consentire le modifiche e successivamente prevenirle.

Anche alcune parti della lingua non possono essere modificate ridefinendo la funzione o la macro. Non è possibile per l'utente modificare, aggiungere o rimuovere moduli speciali (come LET) e liste di argomenti come sintassi speciali e espressioni lambda . La sintassi per gli elenchi di argomenti è cablata nella lingua. La sintassi per espressioni lambda è cablata. Non puoi cambiarlo Dovresti cambiare l'interprete e / o il compilatore.

    
risposta data 08.09.2016 - 19:34
fonte
3

I simboli non sono protetti perché non è necessario che lo siano. Alcune lingue hanno nomi riservati perché la loro sintassi non può tollerare di avere una classe chiamata "classe", anche se tecnicamente si potrebbe evitarlo. A volte è fatto apposta per evitare l'ambiguità nella mente del programmatore e, veramente, ridefinendo - per significare + è il tipo di cose che in teoria sarebbero davvero disastrose. Tuttavia, questo fa parte di un ambiente dinamico, dove a volte questo tipo di flessibilità è utile.

Questi problemi spariscono quando si utilizzano diversi spazi dei nomi, in modo che mypackage:+ sia diverso da yourpackage:+ (gli usi non qualificati di + possono essere controllati durante lo sviluppo per sapere quali simboli sono effettivamente utilizzati).

A proposito, il tuo esempio è in Scheme (lo hai etichettato come lisp in origine), ma Common Lisp è un po 'diverso in questo senso.

I simboli 978 nel pacchetto "COMMON-LISP" standardizzato non devono essere ridefiniti in un programma portatile (comportamento non definito se si esegue questa operazione). Un'implementazione come SBCL offre un modo per bloccare i pacchetti, per evitare modifiche accidentali. Certo, ti dà un modo per sbloccarli.

Questo non è un problema nella pratica perché generalmente non si vuole ridefinire gli operatori standard ma fornire il proprio operatore, definito nel proprio pacchetto.

I pacchetti sono di prima classe, puoi persino modificare quali simboli sono importati in un dato pacchetto, in modo che tu possa a volte cambiare la semantica di un programma esistente senza toccare i suoi file, semplicemente cambiando ciò che significa una funzione non qualificata + ( e ricompilare).

Questo è utile, ad esempio, per eseguire alcuni tipi di strumentazione , come differenziazione automatica . Sostituisci un gruppo di operatori perché vuoi calcolare le informazioni sul tuo programma, ad esempio.

    
risposta data 08.09.2016 - 11:11
fonte
2

Why aren't lisp keywords protected?

Perché non sono parole chiave, sono solo funzioni di libreria come le altre.

Where can this be useful,

Significa che tu, come utente, hai la stessa potenza del designer del linguaggio. Trasformare in una lingua può richiedere diversi decenni ed è una grande impresa. La scrittura di una nuova funzione di libreria richiede solo pochi secondi e può essere eseguita da chiunque.

AFAIK, all programming languages have reserved keywords.

No, non tutti. Lisp no, per esempio. In realtà, Lisp non ha veramente la sintassi .

Io non ha parole chiave, né Ioke o Seph. Anche Poison and Potion non ha parole chiave.

Smalltalk ha anche solo un numero molto basso di parole chiave: true , false , nil , self , super e thisContext . Newspeak ha quasi la stessa lista ( true , false , nil , self , super e outer ). In entrambi i casi, nil , true e false potrebbero invece essere semplicemente chiamate di metodo, lasciando solo 3 parole chiave. (In realtà, Gilad Bracha, il progettista di Newspeak, ha detto che potrebbero essere fatte tutte chiamate di metodo, ma non ne varrebbe la pena.)

    
risposta data 08.09.2016 - 03:08
fonte

Leggi altre domande sui tag