SNOBOL (StriNg Oriented symBOlic Language) é uma linguagem de programação para manipulação de strings1. Um comando em SNOBOL consiste numa regra que opera sobre strings. As operações básicas são: a formação de uma string, procura de padrões e substituição2.
Aparentemente a versão actual do SNOBOL é a SNOBOL4 que não contém algumas das coisas mais interessantes, na minha opinião, que são específicas desta linguagem, tais como o uso do "espaço-em-branco" como operador. Aliás foi esta a propriedade, entre outras, que potenciou a evolução do SNOBOL até à versão 43.
Um exemplo olá-mundo:
output = 'hello world' end
A estrutura completa de um programa em SNOBOL consiste num conjunto de regras que podem ser organizadas em cinco partes: um campo etiqueta, que pode ou não estar presente, na coluna 1; uma string de referência; o padrão; o campo de substituição que começa com o sinal de igual; um campo de go-to que começa com dois pontos. O exemplo seguinte contém os 5 campos referidos anteriormente que serve para retirar os espaços em branco de um conjunto de caracteres:
alpha X ' ' = :s(alpha)
O programa seguinte retira todos os espaços à frase 'As armas e os barões assinalados'
str1 = 'As armas e os barões assinalados' l1 str1 ' ' = :s(l1) output = str1 endO output é a string 'Asarmaseosbarõesassinalados'.
A implementação de comandos condicionais, ou simplesmente condições, é feita recorrendo à instrução go-to e aos labels (etiquetas). O exemplo seguinte mostra como funciona.
quote = '"' vogal = 'a' str1 = 'As armas e os barões assinalados' str1 vogal :s(l1)f(l2) l1 output = 'A frase ' quote str1 quote ' contém um ' quote vogal quote l2 output = 'A frase ' quote str1 quote ' não contém um ' quote vogal quote endo resultado é: A frase "As armas e os barões assinalados" contém um "a". E de uma forma semelhante
quote = '"' vogal = 'a' str1 = 'As armas e os barões assinalados' str1 vogal :s(l1)f(l2) l1 output = 'A frase ' quote str1 quote ' contém um ' quote vogal quote l2 output = 'A frase ' quote str1 quote ' não contém um ' quote vogal quote endobtém-se como resultado a frase "A frase "As armas e os barões assinalados" não contém um "u"".
Os programas aqui descritos estão disponíveis para download.
O exemplo seguinte calcula o factorial de um número inteiro
nini = 3 n = nini factorial = 1 l1 ge(n, 1) :s(l2)f(l3) l2 factorial = n * factorial b. n = n - 1 :(l1) l3 output = 'O factorial de ' nini ' é igual a ' factorial ende o resultado é a frase "O factorial de 3 é igual a 6". Ou ainda na forma mais simples
nini = 3
n = nini
fact = 1
l1 fact = n * fact
n = ge(n,2) n - 1 :s(l1)f(l2)
l2 output = fact
end
Ou ainda definindo a função factorial
define('factorial(n)') :(factorial.end) factorial factorial = eq(n,0) 1 :s(return)f(factorial2) factorial2 factorial = n * factorial(n - 1) :(return) factorial.end test output = factorial(3) end
O método de Herão já descrito nestas páginas fica assim:
i = 10 x = 2.0 y = 1.0 heron0 i = ge(i,1) i - 1 :s(heron1)f(end) heron1 output = 'A ' 10 - i '-ésima iteração do método de Herão é igual a ' y y = (y + (x / y)) / 2 :(heron0) ende o output é
A 1-ésima iteração do método de Herão é igual a 1. A 2-ésima iteração do método de Herão é igual a 1.5 A 3-ésima iteração do método de Herão é igual a 1.41667 A 4-ésima iteração do método de Herão é igual a 1.41422 A 5-ésima iteração do método de Herão é igual a 1.41421 A 6-ésima iteração do método de Herão é igual a 1.41421 A 7-ésima iteração do método de Herão é igual a 1.41421 A 8-ésima iteração do método de Herão é igual a 1.41421 A 9-ésima iteração do método de Herão é igual a 1.41421 A 10-ésima iteração do método de Herão é igual a 1.41421
Outra característica do SNOBOL é a referência indirecta. Consideremos o programa seguinte
a = 'b' b = 'c' output = $a endO output é a letra 'c'. O comando
output = $asignifica "encontra o valor de a; considera este valor como nome de uma variável; encontra o valor dessa variável e dá cá para fora (output) o seu valor".
Uma implementação do jogo das Torres de Hanoi
define('hanoi(n,ns,nd,ni)') :(hanoi.end) hanoi eq(N,0) :s(return) hanoi(n - 1,ns,ni,nd) output = 'Move disc ' n ' from ' ns ' to ' nd hanoi(n - 1,ni,nd,ns) :(return) hanoi.end test hanoi(5,'A','C','B') endo output é
Move disc 1 from A to C Move disc 2 from A to B Move disc 1 from C to B Move disc 3 from A to C Move disc 1 from B to A Move disc 2 from B to C Move disc 1 from A to C Move disc 4 from A to B Move disc 1 from C to B Move disc 2 from C to A Move disc 1 from B to A Move disc 3 from C to B Move disc 1 from A to C Move disc 2 from A to B Move disc 1 from C to B Move disc 5 from A to C Move disc 1 from B to A Move disc 2 from B to C Move disc 1 from A to C Move disc 3 from B to A Move disc 1 from C to B Move disc 2 from C to A Move disc 1 from B to A Move disc 4 from B to C Move disc 1 from A to C Move disc 2 from A to B Move disc 1 from C to B Move disc 3 from A to C Move disc 1 from B to A Move disc 2 from B to C Move disc 1 from A to C
Notas
1. Não vou traduzir string porque não tenho melhor substituto em português.
2. Farber, Griswold e Polonsky -- "SNOBOL, A String Manipulation Language", J. Ass. Comp. Mach. vol. 11, n. 2 (Jan, 1964), pp. 21-30
3. Estou ainda è espera de uns livros para confirmar isto mesmo, no entanto, já confirmei a existência do operador espaço-em-branco em A Snobol4 Tutorial.
Refs:
W. Douglas Maurer, "The programmer's introduction to SNOBOL", New York: American Elsevier Pub. Co., c1976. x, 141 p.; 24 cm.
Created: NaN
Last updated: 23-01-2025 [00:04]
For attribution, please cite this page as:
Charters, T., "SNOBOL: uma linguagem para manipulação de strings": https://nexp.pt/SNOBOL.html (23-01-2025 [00:04])
(cc-by-sa) Tiago Charters - tiagocharters@nexp.pt