Bloco e idiomas com base em texto

Os idiomas baseados em blocos diferem dos baseados em texto de várias maneiras, principalmente porque são projetados para usuários iniciantes. Confira uma lista de itens a serem considerados ao projetar sua própria linguagem baseada em blocos.

Usar listas com base em um

Bloco que seleciona a letra em um determinado índice em uma string e que usa 1
para representar a primeira letra.

Programadores iniciantes reagem mal quando encontram listas baseadas em zero pela primeira vez. Como resultado, o Blockly segue o exemplo do Lua e do Lambda Moo, fazendo a indexação de listas e strings com base 1.

Para usos mais avançados do Blockly, as listas com base em zero são compatíveis para facilitar a transição para o texto. Para públicos mais jovens ou mais novatos, a indexação com base em um ainda é recomendada.

Recomendação: "Um" é o primeiro número.

Suporte a regras de nomenclatura flexíveis

Blocos com os nomes de variáveis sem distinção entre maiúsculas e minúsculas location_x (x em letras minúsculas) e
location_X (X em letras maiúsculas).

Programadores iniciantes não esperam que location_X e location_x sejam variáveis diferentes. Como resultado, o Blockly segue o exemplo do BASIC e do HTML, fazendo com que variáveis e funções não sejam sensíveis a maiúsculas e minúsculas. O Scratch usa uma abordagem mais sutil (como mostrado à direita) e é sensível a maiúsculas e minúsculas para nomes de variáveis, mas não para verificações de igualdade.

Além disso, o Blockly não exige que variáveis e funções se conformem ao esquema [_A-Za-z][_A-Za-z0-9]* típico. Se alguém quiser nomear uma variável List of zip codes ou רשימת מיקודים, tudo bem.

Recomendação: ignore a distinção entre maiúsculas e minúsculas e permita qualquer nome.

Tornar todas as variáveis globais

Programadores iniciantes também têm dificuldades para entender o escopo. Como resultado, o Blockly segue o exemplo do Scratch e torna todas as variáveis globais. A única desvantagem das variáveis globais é que a recursão é mais complicada (é preciso inserir e remover variáveis de uma lista), mas essa é uma técnica de programação que está além do escopo dos usuários-alvo do Blockly.

Recomendação: o escopo está fora do escopo, deixe para depois.

Considere como lidar com valores de retorno opcionais

Muitas funções na programação baseada em texto executam uma ação e retornam um valor. Esse valor de retorno pode ou não ser usado. Um exemplo é a função pop() de uma pilha. O método pop pode ser chamado para receber e remover o último elemento ou apenas para remover o último elemento com o valor de retorno ignorado.

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

Linguagens baseadas em blocos geralmente não são boas em ignorar um valor de retorno. Um bloco de valor precisa ser conectado a algo que aceite o valor. Há várias estratégias para lidar com esse problema.

a) Ignorar o problema. A maioria dos idiomas baseados em blocos projeta a linguagem para evitar esses casos. Por exemplo, o Scratch não tem blocos com efeitos colaterais e um valor de retorno.

b) Forneça dois blocos. Se o espaço na caixa de ferramentas não for um problema, uma solução simples é fornecer dois blocos de cada tipo, um com e outro sem um valor de retorno. A desvantagem é que isso pode levar a uma caixa de ferramentas confusa com muitos blocos quase idênticos.

Um bloco de valor que remove e retorna o último item de uma lista e um bloco de instrução
que apenas remove o último item de uma última.

c) Modificar um bloco. Use um menu suspenso, uma caixa de seleção ou outro controle que permita ao usuário escolher se há um valor de retorno ou não. O bloco muda de forma dependendo das opções. Confira um exemplo disso no bloco de acesso à lista do Blockly.

Bloco que muda de forma de um bloco de valor para um bloco de instrução ao remover
o último item de uma lista, dependendo se ele também retorna esse
item.

d) Consumir o valor. A primeira versão do App Inventor criou um bloco de pipe especial que consumia qualquer valor conectado. Os usuários não entenderam o conceito, e a segunda versão do App Inventor removeu o bloco de pipe e recomendou que os usuários simplesmente atribuíssem o valor a uma variável descartável.

Blocos mostrando duas maneiras diferentes de ignorar a saída de um bloco. O primeiro
usa um bloco de pipe para "comer" o valor, e o segundo define o valor de uma variável
chamada "junk".

Recomendação: cada estratégia tem prós e contras. Escolha o que for melhor para seus usuários.

Gerar código legível

Os usuários avançados do Blockly precisam conseguir analisar o código gerado (JavaScript, Python, PHP, Lua, Dart etc.) e reconhecer imediatamente o programa que eles escreveram. Isso significa que é preciso fazer um esforço extra para manter esse código gerado pela máquina legível. Parênteses desnecessários, variáveis numéricas, espaços em branco comprimidos e modelos de código detalhados atrapalham a produção de um código elegante. O código gerado precisa incluir comentários e estar em conformidade com os guias de estilo do Google.

Recomendação: tenha orgulho do código gerado. Mostre ao usuário.

Aceitar diferenças entre idiomas

Um efeito colateral do desejo de um código limpo é que o comportamento do Blockly é definido em grande parte em termos de como a linguagem compilada cruzada se comporta. O idioma de saída mais comum é o JavaScript, mas se o Blockly fosse compilado em outro idioma, não seriam feitas tentativas indevidas para preservar o comportamento exato nos dois idiomas. Por exemplo, em JavaScript, uma string vazia é falsa, enquanto em Lua é verdadeira. Definir um único padrão de comportamento para que o código do Blockly seja executado, independentemente do idioma de destino, resultaria em um código não mantido que parece ter saído do GWT.

Recomendação: o Blockly não é um idioma. Permita que o idioma atual afete o comportamento.