Infix vs Prefixo Notação - Qual você prefere?

4

Eu tenho aprendido Clojure e olhando Scheme e CL, que me introduziu no mundo da notação de prefixo. No começo eu não gostei, mas ainda está começando a crescer em mim. Para ser honesto, ainda há longos cálculos que são difíceis para mim entender, mas eu acho que é uma questão de eu precisar de mais exposição / prática e eu vou conseguir.

Mas isso me leva à pergunta: que tipo de notação você prefere e por quê?

    
por Jetti 14.12.2010 / 17:54
fonte

8 respostas

13

Acho a notação infixa mais fácil de ler, simplesmente porque venho trabalhando com ela desde o jardim de infância.

    
por 14.12.2010 / 18:08
fonte
9

Eu não tenho preferência. Eu também posso trabalhar bem.

Muitos programadores não percebem que a notação de prefixo é, na verdade, a norma e o infixo é o excêntrico. Afinal, quase todas as linguagens usam a notação de prefixo para chamadas de função / método. É apenas um número relativamente pequeno de operadores aritméticos e lógicos que são infixados.

Quanto mais você olha para o nosso sistema de símbolos matemáticos, mais estridente você vê que eles são. Alguns são infix (+, -, *), alguns são postfix (x 2 ), algum prefixo (tan x), alguns sub-fixos (ratios e frações), e alguma sobreposição. Não é tão simples quanto o PEMDAS.

    
por 14.12.2010 / 19:13
fonte
5

Eu gosto de prefixo para coisas parecidas com funções, infixo para coisas semelhantes a operadores, postfix para coisas semelhantes a propriedades e mixfix para fluxo de controle como coisas:

// prefix:
abs(-3)
sin(PI)

// infix:
1 + 2
4 / 5

// postfix:
list size
employee name

// mixfix:
if a then b else c // (where if/then/else is the mixfix function)

O que eu não gosto são linguagens que não me permitem expressar as coisas da maneira mais natural para mim. Eu não gosto:

// lisp, have to do prefix for everything:
(+ 1 2)
(if a b c)
(size list)

// forth, have to do postfix for everything:
1 2 +
a b c if
1 + 2
4 / 5
    
por 15.12.2010 / 20:25
fonte
3

Prefixo, simplesmente porque a precedência do operador é explícita.

FYI, Cálculos mais longos (realmente, qualquer cadeia de operações) no Clojure podem ser divididos usando as macros -> e ->> . por exemplo:

(-> (get-some-value)
  inc
  (* 2)
  (max 50))

é o equivalente de:

(max (* (inc (get-some-value)) 2) 50)

Enquanto a macro -> adiciona os resultados anteriores aos argumentos da próxima expressão, ->> os anexa. Isso normalmente é muito útil quando usado com funções que esperam coleções e seqs:

=> (->> "some string we want to capitalize"
     (partition-by #{\space})
     (mapcat #(cons (Character/toUpperCase (first %)) (rest %)))
     (apply str))
"Some String We Want To Capitalize"

O fornecimento de recursos para compor facilmente operações mais simples em componentes compostos como esse é uma das grandes vantagens do Clojure. Para ler mais, confira a postagem fogus 'na macro -> e, em seguida, seu post mais tarde sobre o tema dos combinadores de thrush em Clojure <"href=" http://blog.fogus.me/2010/09/28/thrush-in-clojure-redux/"> "thrushy" / a>.

    
por 14.12.2010 / 18:40
fonte
2

Desses dois, prefixo (o postfix pode ser usado da mesma maneira, mas os únicos idiomas que eu conheço são PS e Forth).

  1. Remove a necessidade de qualquer tipo de precedência do operador e associatividade esquerda / direita. Tanto no sentido de que você não precisa pensar sobre isso, e no sentido de que a implementação da linguagem é um pouco mais simples, já que essas forças são pré-resolvidas.
  2. Se aplicado consistentemente, o código resultante é muito próximo a uma árvore, o que torna a análise mais fácil ou desnecessária (e isso permite coisas como a manipulação programática dessa estrutura de árvore).
por 14.12.2010 / 18:37
fonte
1

Eu prefiro ter prefixo quando estou lendo código.

Mas infixa ao pensar em código.

    
por 14.12.2010 / 20:30
fonte
1

Postfix. É claramente o mais comumente usado em linguagens procedurais e linguagens orientadas a objetos.

O código sequencial é a notação postfix:

  do x; do y; do z;

O código OO também é postfix:

   a.x.y

A maioria das linguagens OO e procedurais usaram ambas as convenções strongmente misturadas com um pouco de infixo e talvez algum prefixo para aliviar a carga cognitiva e aumentar o reconhecimento de padrões.

Até mesmo linguagens funcionais usam o formato postfix comumente:

   let x = g r in
   let y = f x in
   ..

como uma maneira de tornar a versão do prefixo menos compreensível:

  let y = f (g r) in

mais fácil de ler por fatoração (imagine uma cadeia de aplicativos mais desagradável:)

    
por 24.11.2011 / 11:05
fonte
1

Depende,

operadores binários nos quais a ordem é importante (assimétrica) se beneficiam da notação infixada, pois é mais fácil distinguir qual caminho o operador será avaliado, por exemplo,

x.Operation(y); //so x is doing "Operation" to y

comparado a

Operation(x,y); //what was the order of arguments again?

operadores simétricos isso é um problema menor e, de fato, às vezes pode ser expandido para operadores n-ários com notação pré ou pós correção quando associativo, por exemplo

sum(1,2,3,4,5);

para pré-correção vs pós-correção Eu prefiro prefixo como como yoda, você fala, com pós-correção

Por último, aqui está o que dijstra tinha a dizer sobre o assunto em essência ele favoreceu o infixo para operações associativas

    
por 24.11.2011 / 12:05
fonte