Envolvendo minha mente em torno da notação de prefixo?

10

Estou lendo sobre o LISP.

Entendo como a notação de prefixo funciona em um determinado nível, mas fiquei pensando se há algum truque para torná-la intuitiva.

Bolinhos de farinha de arroz
fonte
6
Além da prática, você quer dizer?
O usuário RPL é de longe o meu sabor favorito de LISP. Nem tem parênteses! (pt.wikipedia.org/wiki/RPL_(programming_language)) Sinto falta de usar meu HP 50g :-(
Robbie
No começo, parecia pouco intuitivo, mas agora acho maravilhoso, e já fiz a leitura. Na verdade, é assim que falamos: "A soma de ..., o produto de ..." No entanto, exige um tipo diferente de leitura. Agora você simplesmente aplica o operador a todos os argumentos, em vez de lê-los em uma linha.
Mark C
O que há de errado com a notação de prefixo? Quase todos os idiomas estão usando. As chamadas de função quase sempre são prefixo.
SK-logic
Na verdade não; "intuitivo" é intuitivo porque você o aprendeu em uma forma de convenções matemáticas por mais de 20 anos. Como apenas o LISP e talvez alguns outros idiomas usam essa convenção, e você ainda aprenderá a outra muito mais, ela dificilmente se tornará igualmente "intuitiva". E estamos falando apenas expressões simples aqui (2 + 3 ... como você gostaria de experimentar um forro de "meia página" :)?
Rook

Respostas:

6

A leitura mental da esquerda para a direita, como a linguagem falada com os verbos adequados, pode ajudar. Por exemplo (+ 3 2) pode ser "adicione três e dois". No caso mais geral, você pode dizer "executar $ operação em $ operandos". Aplicado ao mesmo caso: "Execute a operação de adição nos três e nos dois".

Joris Timmermans
fonte
O que você faria com ( = 1 2 )e( > 4 2 )
Rice Flour Cookies
3
Você usaria perguntas retóricas. :) Igual? (O que?), "1 e 2 (Erm ... Não ...)!
Arafangion
@RiceFlour (Ei, eu cresci comendo coisas feitas com farinha de arroz - tenho um problema de glúten.) Eu leria "Um é igual a dois?" Ou "Os seguintes são iguais?" Os operadores maior que e menor que não são tão naturais na forma de prefixo, mas eu me pergunto com que frequência eles são usados ​​no código Lisp.
Mark C
7

Truques? Pelo que?

Ainda não parece intuitivo para você porque seu analisador mental não está acostumado a isso. Vai ficar melhor se você apenas usá-lo e lê-lo repetidamente.

Falcão
fonte
Eu nem sequer ler que muito dele, mas agora eu acho que é maravilhoso. Parece que meu cérebro está começando a ter um senso quase "tátil" sobre os parênteses. Eu acho que o sentimento só se tornará mais aguçado.
Mark C
5

Você pode pensar nisso como um tipo de chamada de função:

(operator operand1 operand2 ...)

Não há nada de muito especial nisso. Se você sobrecarregar os operadores em C ++ (e em muitas outras linguagens que o permitem), geralmente precisará definir esse tipo de função exatamente dessa maneira:

MyClass operator+(MyClass const& x, MyClass const& y);
thorsten müller
fonte
Sim, é assim que eu faço. Se você voltar atrás e observar as chamadas de método em Java, C # etc., na verdade, elas são apenas uma notação de prefixo com parênteses em um local um pouco diferente: MyMethod (arg1, arg2).
Nlawalker
4

Muitos idiomas usam uma mistura de prefixo, infixo e até postfix.

Lisp apenas usa apenas prefixo - por padrão. Se o pecado (x) é intuitivo em relação à matemática, então (pecado x) não está longe. Se mover (cachorro, casa) é uma chamada de procedimento tradicional, então no Lisp é apenas (mover cachorro para casa).

O Lisp não abre nenhuma exceção para matemática e trata +, -, * e outros, como chamadas de funções comuns.

Rainer Joswig
fonte
2

Quando (eventualmente) "Tudo é uma chamada de função" (ou uma forma especial ou uma macroexpansão, ambas com a sintaxe superficial da "chamada de função") clicada, parecia bastante natural.

Então, (= 1 2)eu li isso como 'chame a comparação numérica igual a 1 e 2'.

Vatine
fonte