Ancora su BaCon (e newLISP)


Questo post è un po’ più atipico del solito 8) Potrebbe essere considerato come una continuazione a quello su BaCon o un semplice esercizio per il trattamento delle stringhe in newLISP. In quest’ultimo caso sarebbe classificabile come un sottoprodotto di cose fatte nel torrido agosto: i side effects sono molto comuni, anzi l’essenza del Lisp 8)

In ogni caso in conclusione del post citato mi lamentavo del fatto che le keyword di BaCon dovessero essere scritte tutte in maiuscolo. E allora, presto, lanciare newLISP che per queste cose è ottimo. A dire il vero andrebbe bene anche Python, o il C++, o, perché no, BaCon 8)

OK! finita la premessa senza troppo senso, ecco lo script che cerca le parole chiave (keyword) elencate nel file kwlist e le sostituisce con l’equivalente maiuscolo. Attenzione che non basta cercare la stringa costituente la keyword: potrebbe far parte di una parola più lunga. Per questo motivo viene valutata la parola composta dalla keyword con i due caratteri immediatamente precedente e seguente. Questi delimitatori devono essere compresi nella stringa sep –riga 7.

#!/usr/bin/newlisp

(define (in? inst , t sep)
		(if (= inst (upper-case inst))
			(set 't nil)
			(begin
				(set 'sep " \n\r\t(),.+-*/=;:'$")
				(not (not (and (find (first inst) sep)
							   (find (last inst) sep))))
			)
		)
)

(set 'argv (main-args))
(set 'narg (length argv))

; nome dell'eseguibile o dello script
; il primo indice dei parametri è pex + 1
(if (= "newlisp" (argv 0))
	(set 'pex 1)
	(set 'pex 0)
)
(set 'xname (real-path (argv pex)))

; directory dell'eseguibile o dello script
(set 'lp (parse xname "/"))
(pop lp -1)
(set 'xpath (join lp "/"))

; file delle keywords
(if (> (- narg pex) 2)
	(set 'kwfile (join xpath (argv (+ pex 2)) "/"))
	(set 'kwfile (join (list xpath "kwlist") "/"))
)

(set 'kwlist (string (read-file kwfile)))
(set 'kt (parse kwlist))
(set 'kwl (explode kt))
(set 'nkwl (length kwl))

; file di BaCon
(if (> narg pex)
	(set 'sorgente (argv (++ pex)))
	(set 'sorgente "bacon.bac")
)

(set 'text (read-file sorgente))
(push "*" text)
(push "*" text -1)

(set 'updated nil)
(for (c 0 (-- nkwl))
	(begin
		(set 'word-a (kwl c))
		(set 'katt (string (word-a 0)))
		(set 'lkatt (length  katt))
		(set 'rkw (upper-case katt))
		(set 'ppos 0)
		(set 'pos (find katt text 1 ppos))
		(while pos
			(begin
				(set 'st (pop (copy text) (-- pos) (+ lkatt 2)))
				(if (in? st)
					(begin
						(set 'updated true)
						(pop text (++ pos) lkatt)
						(push rkw text pos)
					)
				)
				(set 'ppos (+ pos lkatt 1))
				(set 'pos (find katt text 0 ppos))
			)
		)
	)
)

(if (not updated)
	(exit)
)

(pop text 0)
(pop text -1)
(set 'bak (join (list sorgente "bak") "."))
(if (file? bak)
	(delete-file bak))
(rename-file sorgente bak)
(write-file sorgente text)

(exit)

Per testarlo sono ricorso all’esempio trovato in questa pagina, copiandolo scrivendo tutto minuscolo, così

N.B.: rispetto al listato nella pagina indicata c’è la dichiarazione che la variabile e è int; senza l’istruzione FORMAT da errore e la compilazione abortisce.

Lo script uk.nl è stato compilato, come raccontato in questo post per cui possiamo eseguirlo, in questo modo

Vediamo che le keyword adesso sono come BaCon comanda e possiamo andare avanti

OK. Ma adesso esageriamo (con giudizio nèh!): prendiamo un esempio a caso di quelli indicati, che ne dite del demo calculator? Dopo averlo salvato lo converto tutto in minuscolo con tolower.nl, raccontato qui, lo processo con uk, lo compilo e lo lancio: funziona! (Non riporto le immagini, non direbbero niente di nuovo).

Quindi tutto a posto?
Quasi: il package HUG per gestire la grafica non rispetta la convenzione del maiuscolo. Anche perché include direttamente chiamate a funzioni C. E allora per tutto quanto riguarda HUG niente da fare: dovete fare attenzione al caso.

E questo per il Basic dovrebbe essere sufficiente. O no? 8)

Annunci
Post a comment or leave a trackback: Trackback URL.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: