Unicode – il carattere e il codice – 3

Continuo –e forse oggi finisco– la storia dei caratteri Unicode,  isole  emoji compresi. Ne ho scritto qui e qui.

Ogni tanto mi capita di dover fare qualche elaborazione veloce e –secondo me– un tool unico è newLISP, anche qualcuno poi mi guarda male. Sperando che non mi legga ecco cosa mi è serendipicamente venuto in mente:

Visto? la procedura (ma il manuale le chiama funzioni) char funziona nei due sensi: se gli passi un codice restituisce il carattere, se gli passi un carattere restituisce il codice: due piccioni con una fava 💥

La prima versione, da lanciare come script (sapete, ha i suoi quirks, come si vedrà a breve), ecco il file u0.nl, scrive info provvisorie:

;; u0.nl

(println (main-args))
(set 'dato (main-args 2))
(println 1 " " dato)
(set 'isnum (not (= (int dato) nil))) 
(println 2 " " isnum)
(println 3 " " (char (int dato)))
(println 4 " " (char (main-args 2)))

(exit)

OK, la variabile isnum discrimina i casi codice / carattere; posso quindi passare a u1.nl, prototipo funzionante:

;; u.nl

(set 'dato (main-args 2))
(println 1 " " dato)
(set 'isnum (not (= (int dato) nil))) 
(println 2 " " isnum)
(if isnum 
    (println 3 " " (char (int dato)))
    (println 4 " " (char (main-args 2))))

(exit)

OK, da pulire, eliminare le variabili inutili e, se deve restituire il codice visualizzarlo anche in esadecimale (u2.nl):

;; u2.nl

(if (not (= (int (main-args 2)) nil)) 
    (println (char (int (main-args 2))))
    (println (char (main-args 2)) (format " 0x%x" (char (main-args 2)))))

(exit)

OK, ma adesso il motivo vero per cui questa versione. L’output viene visualizzato nel terminale ma collegandola (via pipe) a xclip posso caricarla nella clipboard, così:

Con newLISP posso eseguire un comando esterno via exec:

E, come previsto ho il dato nella clipboard. Applicato al compito corrente diventa (u3.nl):

;; u3.nl

(if (not (= (int (main-args 2)) nil))
    (set 'ans (char (int (main-args 2))))
    (set 'ans (string (char (main-args 2))
              (format " 0x%x" (char (main-args 2))))))
(println ans)
(exec (string "echo " ans " | xclip -f -selection clipboard"))
    
(exit)

OK, funziona come previsto. L’ultimo passo è quello di rendere eseguibile lo script cosa che si potrebbe fare aggiungendo la shebang e abilitandolo con chmod. Ma esiste un alternativa assai più sexy, compilarlo. c’è però un quirk come annunciat all’inizio del post.

Consideriamo lo script di test t.nl:

#!/usr/bin/newlisp

(set 'largs (main-args))
(set 'len (length largs)) 
(println len)
(println largs)
(for (n 0 (- len 1))
    (println n " " (largs n)))
    
(exit)

Compilo lo script:

e lo eseguo

OOPS! 😯 il primo argomento adesso è il numero 1 😯
Per cui lo script per la gestione dell’Unicode va modificato (nelle righe indicate con * come commento) sostitunedo il parametro 2 con 1 per main-args; inoltre gestisco la mancanza del parametro, file uc.nl:

;; uc.nl viene compilato con il nome _u

(when (= (length (main-args)) 1)                        ;; * 
        (println "manca il codice o il carattere")
        (exit 2))

(if (not (= (int (main-args 1)) nil))                   ;; *
    (set 'ans (char (int (main-args 1))))               ;; *
    (set 'ans (string (char (main-args 1))              ;; *
              (format " 0x%x" (char (main-args 1))))))  ;; *
(println ans)
(exec (string "echo " ans " | xclip -f -selection clipboard"))
    
(exit)

Ed ecco

Anche se non posso farlo vedere il contnuto della clipboard è quello previsto. Comando _u adottato –per me. Da trasferire in ~/bin.

E –sempre secondo me– newLISP rockz! 👽

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

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

Logo di WordPress.com

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

Google photo

Stai commentando usando il tuo account Google. 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 )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

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