Qual é a diferença entre Lisp-1 e Lisp-2?

94

Eu tentei entender a diferença entre Lisp-1 e Lisp-2 e como isso se relaciona com Clojure, mas ainda não entendi direito. Alguém pode me esclarecer?

appshare.co
fonte

Respostas:

68

De acordo com a wikipedia :

Se um namespace separado para funções é uma vantagem, é uma fonte de contenção na comunidade Lisp. É normalmente referido como o debate Lisp-1 vs. Lisp-2. Lisp-1 se refere ao modelo de Scheme e Lisp-2 se refere ao modelo de Common Lisp.

É basicamente sobre se variáveis ​​e funções podem ter o mesmo nome sem conflito. Clojure é um Lisp-1, o que significa que não permite que o mesmo nome seja usado para uma função e uma variável simultaneamente.

pauldoo
fonte
11
Então, um Lisp-2 não é mais confuso com funções e variáveis ​​com os mesmos nomes?
appshare.co
39
Parte do motivo é que os programadores que usam dialetos Lisp-2 não se preocupam em ter funções e variáveis ​​com os mesmos nomes. listé freqüentemente usado como um parâmetro de função e ninguém coisas, meu Deus, isso é tão confuso, pois (list ...)é uma função padrão. Muitas funções que têm listcomo variável não usam a listfunção, ou não a usam perto dessa variável. Mesmo quando isso acontecer não é muito ruim: (list foo list). Isso não é mais confuso do que uma frase como "lute pelo bom combate", em que a mesma palavra aparece como substantivo e verbo.
Kaz
5
@Zubair Java tem ainda mais espaços de nome. Você pode definir uma classe, um método e uma variável com o mesmo nome.
ceving
19
Como mnemônico, penso que Lisp 1s tem 1 namespace e Lisp 2s tem 2 namespaces (um para funções e outro para variáveis).
Nick McCurdy
4
@NickMcCurdy Como mnemônico, penso em uma bicicleta como tendo duas rodas e um triciclo tendo três.
Kaz
71

Você pode gostar de ler este artigo de Richard Gabriel. É um resumo das questões que a comunidade Lisp estava discutindo em Lisp1 vs Lisp2. É um pouco denso e lento nas primeiras seções, mas é muito mais fácil de ler quando você passa da seção 5.

Basicamente, Lisp1 tem um único ambiente que mapeia símbolos para valores, e esses valores podem ser "regulares" ou funções. Lisp2 tem (pelo menos) dois namespaces (os símbolos têm um slot para seu valor de função e outro para um valor regular). Portanto, em Lisp2, você pode ter uma função chamada foo e um valor chamado foo, enquanto em Lisp1, o nome foo pode se referir apenas a um único valor (função ou outro).

Existem várias compensações e diferenças de gosto entre os dois, mas leia o jornal para obter os detalhes. O livro de Christian Queinnec, "Lisp in Small Pieces", também discute as diferenças tecidas ao longo do texto.

Peter McLain
fonte
7
Uma das seções mais enigmáticas do artigo de Gabriel é a seção 11 sobre Multiprocessamento. Nessa seção, ele sugere que Lisp1 é mais propício para um estilo funcional de programação, portanto, mais propício para multiprocessamento. Obviamente, isso é interessante para Clojure. Mas não tenho certeza de por que Lisp1 é mais propício para FP. Alguém tem uma visão sobre isso?
Peter McLain
40
provavelmente porque o ponto principal do FP é tratar as funções como valores de primeira classe, portanto, é muito mais conveniente e conceitualmente mais limpo tratá-las da mesma forma que todos os outros valores
mikera
10
@PeterMcLain Quando os usuários dos dialetos Lisp-1 dizem que o Lisp-1 é mais condutivo para a programação funcional, o que eles querem dizer é que você não precisa encher o código de operadores funcalle function. Eles desaparecem em um Lisp-1.
Kaz
3
Um exemplo do que acontece quando um Schemer tenta escrever Lisp: emacs.stackexchange.com/q/28979/2787
ceving
2
você usou a frase "pelo menos" sobre Lisp-2. A diferenciação simples entre os 2 casos é: se o símbolo está na posição inicial de uma expressão s ou não (se estiver, procure no namespace da função, caso contrário, no namespace da variável). Você pode dar alguns exemplos de outros, além desses 2 casos?
Daniel Dinnyes