Autore Topic: strLib - Libreria per Stringhe  (Letto 3257 volte)

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
strLib - Libreria per Stringhe
« il: 15 Ottobre 2008, 18:09:38 »
Questo progetto nasce dalla constatazione che in Gambas sono presenti pochissime funzioni per la gestione delle stringhe. strLib fornisce quindi funzioni stringa che sono presenti in altri linguaggi (quali VB, Java, PHP) e non in Gambas.

Attualmente il numero di funzioni fornite da strLib è molto limitato. Inoltre, purtroppo, non è possibile implementare funzioni stringa in maniera efficiente con Gambas. Tuttavia, chi ha necessità di svolgere operazioni di alto livello con le stringhe potrebbe trovarlo utile.

Le funzioni attualmente implementate sono:
   * CharAt() - restituisce il carattere n di una stringa
   * CharFromLast() - idem, ma il conteggio parte dall'ultimo carattere
   * Repeat$() - ripete una stringa n volte
   * StartsWith() - verifica se str1 inizia con str2
   * EndWith() - verifica se str1 finisce con str2
   * Implode() - trasforma un array in una stringa, eventualmente con separatore
   * Substr() - restituisce n caratteri di una stringa, partendo dal carattere c; n è opzionale
   * Substring() - restituisce i caratteri di una stringa che vanno da c a n (è diverso da substr()); n è opzionale
   * Reverse() - inverte una stringa

Ogni funzione è documentata nel codice.
La licenza è la GPL 3.

Aspetto commenti e contributi.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: strLib - Libreria per Stringhe
« Risposta #1 il: 16 Ottobre 2008, 01:18:10 »
Il tuo lavoro mi ha incuriosito, e mi sono scaricato i sorgenti che ho analizzato:

Codice: [Seleziona]

1* CharAt() - restituisce il carattere n di una stringa
2* CharFromLast() - idem, ma il conteggio parte dall'ultimo carattere
3* Repeat$() - ripete una stringa n volte
4* StartsWith() - verifica se str1 inizia con str2
5* EndWith() - verifica se str1 finisce con str2
6* Implode() - trasforma un array in una stringa, eventualmente con separatore
7* Substr() - restituisce n caratteri di una stringa, partendo dal carattere c; n è opzionale
8* Substring() - restituisce i caratteri di una stringa che vanno da c a n (è diverso da substr()); n è opzionale
9* Reverse() - inverte una stringa


ho numerato le voci, in modo da semplificare i paragoni, per alcuni miei dubbi:

Codice: [Seleziona]

1* Mid ( sSource AS String , iStart AS Integer [ , iLength AS Integer ] ) AS String
2* Right ( String AS String [ , Length AS Integer ] ) AS String
3* String ( Length AS Integer , Pattern AS String )
4* ...
5* ...
6* String[].Join( Separator AS String )
7* Mid ( sSource AS String , iStart AS Integer [ , iLength AS Integer ] ) AS String
8* Mid ( sSource AS String , iStart AS Integer [ , iLength AS Integer ] ) AS String
9* ...


Perdona la domanda:

A parte alcune, veramente molto simpatiche, per le altre funzioni mi sembra già ve ne siano altrettante in Gambas... sbaglio, oppure ho letto male il tuo codice?

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: strLib - Libreria per Stringhe
« Risposta #2 il: 16 Ottobre 2008, 01:54:18 »
Allora, vediamo...

1 e 2) CharAt() e CharFromLast() fanno in effetti una cosa che può fare anche Mid(), cioè restituire un solo carattere. Sono diversi solo i parametri. CharAt() è identico a String.charAt() di Java e CharFromLast è uguale a CharAt(), solo che CharFromLast(0) è l'ultimo carattere, non il primo.
3) Si, questo è esattamente la stessa cosa! Rimuoverò questa funzione.
4 e 5) Anche questi sono due metodi Java.
6) Anche questa è una cosa che non conoscevo e che non ho trovato nella documentazione... tra l'altro ne avevo bisogno, ma non l'ho trovata e pensavo non ci fosse. La rimuoverò o la modificherò.
7) Hai ragione, è uguale.
8) E' un modo diverso per fare la stessa cosa: non indichi il primo e l'ultimo carattere, ma il primo carattere e la lunghezza della sottostringa che ti interessa.
9) Questo è anche in vb

Grazie per le segnalazioni, ricapitolando eliminerò Repeat$(), Substr() e forse Implode(). Ho nel to-do queste funzioni da implementare, ti risulta che esistano? (a me non sembra, ma...)

* LPad(), RPad(), Pad() - inseriscono caratteri riempitivi, esempio: LPad("ciao", "=-", 10) = "=-=-=-ciao"
* InitCap() - prime lettere di tutte le parole in maiuscolo
* UCFirst() - prima lettera della stringa in maiuscolo
* ICase() - inverte maiuscolo/minuscolo
* WordCount() - restituisce il numero di parole
* isEmail(), isUrl()
* StripTags() - rimuove i tag xml
* toRoman(int) - restituisce int in numeri romani

Grazie!

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: strLib - Libreria per Stringhe
« Risposta #3 il: 16 Ottobre 2008, 11:33:39 »
Ciao. Per continuare con l'analisi di MD:

4* StartsWith() - verifica se str1 inizia con str2

PRINT "helloworld" LIKE "hello*"
True

5* EndWith() - verifica se str1 finisce con str2

PRINT "helloworld" LIKE "*world"
True


ciao

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: strLib - Libreria per Stringhe
« Risposta #4 il: 16 Ottobre 2008, 12:35:59 »
Infatti giulio, quelle due sono sicuramente validissime!


for santecaserio:

in effetti, Join() non è documentato, almeno direttamente, e poi esiste la classe String (non la funzione), che alcune caratteristiche utili...

Ritornando alla tua idea:
Codice: [Seleziona]

* LPad(), RPad(), Pad() - inseriscono caratteri riempitivi, esempio: LPad("ciao", "=-", 10) = "=-=-=-ciao"
* InitCap() - prime lettere di tutte le parole in maiuscolo
* UCFirst() - prima lettera della stringa in maiuscolo
* ICase() - inverte maiuscolo/minuscolo
* WordCount() - restituisce il numero di parole
* isEmail(), isUrl()
* StripTags() - rimuove i tag xml
* toRoman(int) - restituisce int in numeri romani


Ecco, queste mi sembrano molto indicate!
In effetti, non mi sembra ci sia nulla del genere al momento in Gambas; non mi sovviene il Pad() (e similari), ma non mi pare ci siano.
Approvo! :-)
Le hai già pronte? :-)
Ovviamente scherzo, ma concordo sull'utilità.
Se riesci, visto che il lavoro è tuo, di dargli nomi meno Java, e un pò più Gambas... così, tanto per non scopiazzarli pari pari... certo, sicuramente per alcuni non si può fare altrimenti (es. Pad)...

Bel lavoro e... buon lavoro!

Tra l'altro, se ne viene a conoscenza Benoit, te le ruba e le inserisce direttamente in Gambas...

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: strLib - Libreria per Stringhe
« Risposta #5 il: 16 Ottobre 2008, 14:06:25 »
Be', se lo fa spero che le implementi in C in modo che siano un po' più veloci  :lol:

Hai suggerimenti per i nomi? La mia idea era fare in modo che chi viene da Java, Php e simili capisse subito queste funzioni, ma non è detto che si debbano chiamare così.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: strLib - Libreria per Stringhe
« Risposta #6 il: 16 Ottobre 2008, 14:51:25 »
Mah, il mio era solo un consiglio, o anche un'idea per amalgamare queste funzioni con il resto del linguaggio, ma non è stabilito da nessuna parte che uno debba per forza dare nomi diversi. Come ho detto, spesso non si può dare altre nomenclature, perchè a volte darebbero significati diversi, come ad esempio PAD; se poi si vuole usare LPAD piuttosto che LeftPad, dipende dai gusti, l'impotante che siano nomi chiari, e del resto se presi da java, sono già belli che collaudati. Insomma la cosa ha poca importanza...

Adesso non mi vengono in mente nomi, ma forse la sintassi più lunga potrebbe essere un'idea: LeftPad(), RightPad(), Padding()... boh?!?

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: strLib - Libreria per Stringhe
« Risposta #7 il: 16 Ottobre 2008, 23:15:32 »
Mi sono accorto di un bug terribile: CharAt() e CharFromLast() erano uguali. Ora ho implementato CharFromLast() (è uguale all'altra ma con una riga di codice in più... però se manca quella riga uno pensa di fare una cosa e invece ne fa un'altra).

Oltre a ciò ho rimosso Repeat$() e Substr(). Ho lasciato Implode(), la modificherò.

Ho implementato:

* LeftPad(), RightPad(), Pad()
* WordsCount()

So che i cambiamenti sono pochi, ma dovevo assolutamente postare questa versione per correggere CharFromLast().

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: strLib - Libreria per Stringhe
« Risposta #8 il: 17 Ottobre 2008, 00:07:25 »
Hai fatto bene!

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Versione 0.0.3
« Risposta #9 il: 17 Ottobre 2008, 21:59:03 »
Rilascio già una nuova versione perchè... mi sono accorto che potrebbe essere usato per applicazioni web, e di conseguenza volevo metterlo sotto versione AGPL. La differenza rispetto alla GPL è che chiunque usi il software ha gli stessi diritti: cioè, tu non puoi scaricarlo, metterlo sul server e impedire ai tuoi utenti di vedere i sorgenti, trasformandolo di fatto in un programma proprietario.

Segnalo la documentazione on line, da completare e per ora solo in inglese:
http://documentation.wikia.com/wiki/StrLib
Ringrazio il progetto Documentation ospitato da Wikia.

Ho implementato un po' di funzioni, è tutto elencato nella documentazione. La sintassi per ora è solo nel codice.

Allego la versione 0.0.3 in vari formati.

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Versione 0.0.3
« Risposta #10 il: 04 Gennaio 2009, 01:27:07 »
Arieccomi! Rilascio la versione 0.0.4, a cui ho aggiunto:

- SqlName() - formatta un identificatore Sql (nome di tabella, campo, etc) utilizzando il carattere ` come virgolette (questa cosa si usa in MySQL, non so se si usi anche in altri dbms...)

- Soundex()
- Soundex4()
- ReverseSoundex()
- SoundsLike()

Tre varianti dell'algoritmo Soundex. Passandogli una parola, restituiscono una stringa che rappresenta il modo in cui la parola si pronuncia in inglese (in modo molto approssimativo). Serve per controllare se due parole si pronunciano allo stesso modo o, comunque, in modo simile. A mio parere funziona benino anche con lo spagnolo. Soundex4() è la versione originale, Soundex() è la versione di MySQL che a volte non rispetta il limite di 4 caratteri, ReverseSoundex() è una variante. SoundsLike() restituisce true se due parole si pronunciano allo stesso modo.

- Levenshtein()

La distanza Levenshtein (o distanza edit) tra due stringhe è il numero minimo di modifiche basilari che occorre apportare a Str1 per renderla uguale a Str2. Le modifiche basilari sono: inserimento, cancellazione, sostituzione di un singolo carattere.

----

Non impressionatevi leggendo la spiegazione, guardando il codice vi accorgerete che sono funzioni assolutamente banali e che le differenze tra i 3 soundex sono minime.

Critiche? Commenti? Suggerimenti?

  • Visitatore
Re: strLib - Libreria per Stringhe
« Risposta #11 il: 19 Gennaio 2009, 18:03:37 »
Scusate l'ignoranza ma come faccio a inserirle in gambas ?

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: strLib - Libreria per Stringhe
« Risposta #12 il: 19 Gennaio 2009, 23:19:28 »
@giac_fab: scompatti l'archivio, salvi il file e poi lo importi nel progetto dove vuoi usare le funzioni.

@santecaserio: credo che un solo formato per il tuo programma sia più che sufficiente. Eviterei i formati non compressi (come il .tar) e quelli poco diffusi su Linux (come lo .zip). Rimangono il .tar.gz, quasi lo standard su Linux, e il .7z, anch'esso però poco noto anche se più "comprimente" dell'altro.
Visita il mio sito personale: http://www.leonardomiliani.com

  • Visitatore
Re: strLib - Libreria per Stringhe
« Risposta #13 il: 29 Gennaio 2009, 10:46:35 »
Si , mi son espresso male .... intendevo come faccio ad inserirlo in maniera tale sia sempre presente, senza importarlo ogni volta.... sempre se è possibile ...

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: strLib - Libreria per Stringhe
« Risposta #14 il: 29 Gennaio 2009, 14:39:38 »
Dovresti creare un componente da caricare dentro a Gambas:
http://gambasdoc.org/help/def/component
Visita il mio sito personale: http://www.leonardomiliani.com