(’asterisco’ == 42.chr) != ?* => true
Wednesday, June 27th, 2007Estava comprando alguns livros e achei um de promoção “O Signo, de Isaac Epstein” foi baratinho, mas também oitenta páginas… O livro em si me despertou um grande interesse pelo assunto de semiótica. Não demorou para que adquirisse o livro “Semiótica, de Charles S. Peirce” que define semiótica como a filosofia científica da linguagem. Linguagem no sentido de algo provê a comunicação entre duas ou mais coias através de elementos, como signos, sons, símbolos, mímicas e outros. A Semiótica é redefinida por vários autores mas a definição de Charles detêm minha atenção mais do os outros que consideram apenas uma disciplina da cadeira de lingüística.
Na graduação de Ciência da Computação a matéria que mais me interessou(e interessa) foi(é) Linguagens Formais e Compiladores, vendo a formação dos componentes de uma gramática, a validação, organização e significado de símbolos e palavras de um determinado código-fonte. Os passo dos analisadores léxicos, sintáticos e semáticos nada mais é do um dos nossos sistemas de interpretação de mensagens.
Desde a infância passamos pelos mesmos processos te entendimento dos signos e vamos adquirindo base de conhecimento capacitando-nos a detecção de padrões dos mais simples aos mais complexos, como: “se há fumaça => há fogo”, “se algo está úmido => é porque tem algo líquido”. Parece fácil mas as vezes ao pensarmos em uma solução nos deparamos com a falta desta comparação do que conhecemos e o que é novo.
Vamos fazer um estudo de caso de um símbolo o asterisco.
O Asterisco
Se perguntarmos o que é * a uma criança que não conhece a palavra asterisco teremos entre outras respostas algo como “é uma estrelinha”, “um pontinho explodido”…. Para um adulto a afirmação é um “asterístico” e para os mais sensatos “asterisco” lexicograficamente correto. Portando entramos na idiossincrasia; que é a forma de percepção individual do símbolo. Por exemplo, cada um tem o asterisco como um símbolo que representa algo de forma distinta.
Qual a função(significado) do símbolo asterisco?
Não sei. Depende da linguagem, do contexto em que se encontra.
Para a língua portuguesa ele não faz parte da gramática e nem do alfabeto. Em anúncios sabemos que ele é o “porem ou o lá-invem!”. Exemplo.: ‘Fale a R$ 0,01*’, nas letras bem pequenas temos ‘promoção válida somente para falar que ama sua sogra no dia 30 de fevereiro’. Em alguns livros o * induz ao leitor ler o rodapé explicativo, etc. Já na informática comum pode ter vários significados. Temos alguns:
- Em um editor de texto moderno tenta detectar que o * é um marcador e troca por uma bolinha.
- Caractere de multiplicação
- Todos arquivos em uma lista de arquivos. Ex: ls *.txt
Veja a cima que o asterisco é também um ‘Caracter de multiplicação’. Agora você lembra da terceira série que o x era o sinal de multiplicação? E mais adiante …
2 x 2 = 4
depois
2 . 2 = 4
e agora no computador
2 * 2 = 4
Calma, não fique louco, já passamos desta fase… mas deu para entender um pouco sobre idiossincrasia. A sua idiossincrasia tem que ser mutável principalmente para usar a linguagens de programação como C e Ruby. Em C temos ponteiro com * para o valor e ** ponteiro para apontador…, comentários e assim vai. Demonstraremos abaixo como o asterisco pode ser genérico em uma linguagem computacional, Ruby.
Asterisco em Ruby
O caracter
42.chr #=> '*'
o valor ASCII do caracter
?* #=> 42
Em Ruby o asterisco pode ser um método
Multiplicação (Numeric * Numeric)
2 * 2 #=> 4
Potenciação (Numeric ** Numeric)
2**3 #=> 8
Classe String(String * Numeric)
'ha! ' * 5 #=> 'ha! ha! ha! ha! ha! '
Classe Array (Array * String)
[20, 30, 40] * ':' #=> '20:30:40' o mesmo que join
Observe que o resultado que é a multiplicação de todos os elementos e não uma operação distributiva de matemática. (Array * Fixnum)
[20, 30, 40] * 2 #=> [20, 30, 40, 20, 30, 40]
mas podemos redefinir o método * para um resultado diferente
a=[20, 30, 40] def a.*(valor) self.map{|v| v*valor} end a * 2 #=> [40, 60, 80]
Expressões Regulares, zero ou mais ocorrências
a='asterisco' a =~ /a*/ #=> 0 a =~ /z*/ #=>0
Atribuição
Atribuição com multiplicação
d=2 d*=2 #=> 4
Atribuição com potenciação
d=2 d**=3 #=> 8
Atribuição paralela
a=[1,2,3,4] x,y=a #=> x =1 e y=2 x,*y=a #=> x=1 e y=[2,3,4] x,*y=33 #=> x=33 e y=[]
Conversão em Array de um argumento de bloco
a=[1,2,3,4,5] a.each {|v| puts v} 1 2 3 4 5 a.each {|*v| puts v} [1] [2] [3] [4] [5]
Argumentos de linha de comando
ruby -e 'puts $*' teste1 teste2
resultado
teste1 teste2
equivalente ao ARGV
ruby -e 'puts ARGV' teste1 teste2
resultado
teste1 teste2
Utilização em argumentos
Na definição do método
def teste(um_valor, *argumentos) puts 'valor = ' + um_valor.to_s puts 'args = ' + argumentos.join(', ') end
utilizando o método teste
teste('A',2,'B',4,5,6,7)
resultado
valor = A args = 2, B, 4, 5, 6, 7
passando um array
array=[20,'C',40,'D'] teste(array)
resultado
valor = 20C40D args =
mas com a mágica do *
array=[20,'C',40,'D'] teste(*array)
resultado
valor = 20 args = C, 40, D
o mesmo vale para o case. Case normal
s='teste' case s when Fixnum: puts 'N' when String,Symbol: 'S' end
resultado
'S'
podemos fazer assim com *
s='teste' tipos=[String,Symbol] case s when Fixnum: puts 'N' when *tipos: 'S' end
resultado
'S'
Asterisco em Ruby dá nó na cabeça mas depois começamos a entender a idiossincrasia do Matz.
