LINUX.ORG.RU

Синтаксис и LISP'ы

 , ,


0

1

Часто можно наткнуться на мнение, что у лиспа(ов) нет синтаксиса. Хотелось бы понять, что конкретно тут имеется в виду.

Во-первых, синтаксическая запись s-expr'ов так же является некоторым языком, со своими синтаксическими правилами и возможностью описания посредством грамматики.

Во-вторых, различные диалекты лиспа вводят специальные дополнительные синтаксические конструкции, вроде [ и ] в clojure или typed racket.

Имеется в виду, что этот синтаксис прост и фактически без особых изменений определяет AST?


Ответ на: комментарий от anonymous

Ты идиот? Если бы они не были переопределены, было бы так write(list(1,2,3))

anonymous ()
Ответ на: комментарий от anonymous

Если бы они не были переопределены, было бы так write(list(1,2,3))

У тебя так и есть. А должно быть write list(list(1,2,3))

anonymous ()
Ответ на: комментарий от anonymous

И снова повторю вопрос про одновременное использование нескольких библиотек, в каждой из которых по-своему переопределены скобочки.

anonymous ()
Ответ на: комментарий от Miguel

Кажый макрос вводит новый кусок синтаксиса.

Но ведь тогда получается что каждая функция тоже.

Debasher ★★★★★ ()
Последнее исправление: Debasher (всего исправлений: 1)
Ответ на: комментарий от monk

а когда 2*2+3*4, то надо учитывать порядок операций.

Нет, вобщет тоже очевидно:

./rebol -q --do «print 2 * 2 + 3 * 4 quit»
28

loz ★★★★★ ()
Ответ на: комментарий от anonymous

Ты кто такой, анонiмус? Пошёл нахуй, анонiмус.

anonymous ()
Ответ на: комментарий от anonymous

Это не он. Код отформатированный.

anonymous ()
Ответ на: комментарий от loz

./rebol -q --do «print 2 * 2 + 3 * 4 quit»
28

А это весьма неожиданный результат. Круче было только на PL/1, где 10/3 + 8 = 1.3333333

monk ★★★★★ ()
Ответ на: комментарий от monk

В смолтолке тоже будет 28, нет под рукой чтобы показать. Вобщем спорно, нужно ли вводить в язык операторы и усложнять его их приоритетами, или сделать простые правила, одинаковые для всех вычислений.

loz ★★★★★ ()
Ответ на: комментарий от loz

Вобщем спорно, нужно ли вводить в язык операторы и усложнять его их приоритетами, или сделать простые правила, одинаковые для всех вычислений.

Если вводить, то с приоритетами. Плохо, когда запись, которая выглядит как привычная делает что-то совсем другое.

В смолтолке тоже будет 28

Да. Лучше бы там 2 *: 2 +: 3 *: 4 сделали. Было бы меньше неожиданностей.

monk ★★★★★ ()
Ответ на: комментарий от loz

В смолтолке ... усложнять его их приоритетами

arr at: i put: (arr at: i + 1)

не будет arr[i] = arr[i]+1 как выглядит. Так что приоритеты там тоже жизнь портят.

monk ★★★★★ ()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

С точки зрения семантики Ъ-ооп, число — это объект, получающий сообщение 1.+(1). Поэтому, по крайней мере, ядро языка не допускает приоритетов. Приоритеты можно реализовать препроцессором.

anonymous ()
Ответ на: комментарий от Debasher

то что принято называть синтаксисом — это спецформы, стейтсментс, и тому подобное говно, захардкоренное на уровне языка. Макросы — это тоже синтаксис, поскольку макросы не интегрированы в язык, ортогональны ему. Выражения языка — это не синтаксис, это просто ссылки на значения, которые могут быть в любой момент переопределены. Именно так обычно трактуется понятие синтаксис.

anonymous ()
Ответ на: комментарий от anonymous

С точки зрения семантики Ъ-ооп, число — это объект, получающий сообщение 1.+(1). Поэтому, по крайней мере, ядро языка не допускает приоритетов.

Значит Smalltalk не Ъ-ооп. Там 3 + 4 max: 5 + 6 будет 11, а не 13

monk ★★★★★ ()
Ответ на: комментарий от anonymous

нет, у меня write((1,2,3)), разуй глаза.

anonymous ()
Ответ на: комментарий от anonymous

то что принято называть синтаксисом — это спецформы, стейтсментс, и тому подобное говно

То, что принято называть синтаксисом - это набор правил, которые позволяют из raw-текста сделать АСТ. По-этому:

Макросы — это тоже синтаксис

Макросы - не синтаксис. Потому что если у тебя написано (yoba huy pizda), то для построения АСТ совершенно не важно что такое yoba - функция, макрос, спецформа, еще какая-нибудь поебота.

anonymous ()
Ответ на: комментарий от monk

Я тонкостей смоллтока не знаю. Могу сказать за Io. Там приоритеты есть, но они не на уровне языка, а на уровне препроцессора. Любое арифметическое выражение можно записать в виде 1 +(2) +(3) и так далее. В такие сообщения код на самом деле раскрывается, приоритеты разруливаются скобками. Возможно, в смоллтоке что-то вроде того. Просто немного сахара, который не влияет на семантику.

anonymous ()
Ответ на: комментарий от anonymous

нет, у меня write((1,2,3)), разуй глаза.

Ну да, убираем первые скобки получается write(list(1,2,3)) убираем вторые скобки получается write list(list(1,2,3))

А у тебя только одни перегружены.

anonymous ()
Ответ на: комментарий от anonymous

Ты подумай, почему define-syntax вообще присутствует, и от этого пляши. В других языках не нужен синтаксис, там все определяется как обычная функция, просто потому что в Ъ, функция с аргументами — это просто сообщение, и что с ним делать решает получатель этого сообщения. В лиспе это невозможно, а если бы было возможно, никакой define-syntax был бы не нужен. Макросы — это костыли для языка, где нет лени.

anonymous ()
Ответ на: комментарий от anonymous

Ты бред какой-то несешь

где бред? У тебя написано ((1,2,3)) если ты перегрузил скобки, должно получиться list(list(1,2,3)), а получилось list(1,2,3)

anonymous ()
Ответ на: комментарий от anonymous

Ты подумай, почему define-syntax вообще присутствует

Он присутствует за тем, чтобы можно было расширять семантику языка, очевидно.

В других языках не нужен синтаксис

В каких языках не нужен синтаксис? Можешь привести пример такого языка «без синтаксиса»?

В лиспе это невозможно

Кончно возможно. Более того - так оно везде и есть.

Макросы — это костыли для языка, где нет лени.

Вообще-то лень тривиально выражается через лямбды, так что лень есть в любой языке с лямбдами. И там, где нужна лень, в лиспе используется лень. Не макросы. Вообще непонятно, что общего между макросами и ленью.

anonymous ()
Ответ на: комментарий от anonymous

Так если в 10 библиотеках переопределены скобки, в каждой по-своему, то каким образом мне использовать эти десять библиотек вместе? Покажи, пожалуйста.

anonymous ()
Ответ на: комментарий от anonymous

Я тебе повторяю, (1,2,3) значит с момента переопределения то же самое, что и list(1,2,3). Это тебе не лисп, там нет никаких костылей, никаких перезагрузок, перезаписей и прочего говна. (1,2,3) — это выражение языка, функция с аргументами. В терминах ООП — это сообщение.

anonymous ()
Ответ на: комментарий от anonymous

Похрену твои сраные библиотеки. В ООП сообщения инкапсулированы объектами. Если у одного объекта list определен как {}, а у другого [], так оно и будет работать, никаких конфликтов не возникает. В Io библиотеки тоже подключаются как объекты. На уровне языка библиотека — это объект.

anonymous ()
Ответ на: комментарий от anonymous

(1,2,3) значит с момента переопределения то же самое, что и list(1,2,3).

Правильно. А ((1,2,3)) значит list(list(1,2,3)), соответственно write((1,2,3)) = write list(list(1,2,3)). А у тебя внешние скобки не перегружены.

anonymous ()
Ответ на: комментарий от anonymous

Похрену твои сраные библиотеки.

То есть задача принципиально нерешаема? Ну это детский сад какой-то. Нахрена нужен такой язык, на котором даже столь простые вещи выразить принципиально нельзя?

anonymous ()
Ответ на: комментарий от anonymous

Можешь привести пример такого языка «без синтаксиса»?

Io Smalltalk

что общего между макросами и ленью

Макросы используются в качестве суррогата лени.

выражается через лямбды

Да, а также через строки или квотированные списки. Но писать так никто не сможет. Слишком сложно все становится.

anonymous ()
Ответ на: комментарий от anonymous

Я тебе объяснил, что в нормальном языке костыли не нужны. Все выражается естественным путем. Для подобных выкрутасов уже есть жаба.

anonymous ()
Ответ на: комментарий от monk

которая выглядит как привычная делает что-то совсем другое.

Она делает ровно то, что описано в документации. А привычность у всех разная.

loz ★★★★★ ()
Ответ на: комментарий от anonymous

Элементарно: по-порядку все применяется.

loz ★★★★★ ()
Ответ на: комментарий от anonymous

Io Smalltalk

Но там есть синтаксис и его больше чем в лиспе. Другие примеры?

Макросы используются в качестве суррогата лени.

Нет, не используются.

Но писать так никто не сможет. Слишком сложно все становится.

Нет, все просто и все так пишут. Ты либо говоришь о том, чего не знаешь, либо врешь. В обоих случаях ничего хорошего.

anonymous ()
Ответ на: комментарий от anonymous

То есть задача принципиально нерешаема?

Ты спрашивал

Так если в 10 библиотеках переопределены скобки, в каждой по-своему, то каким образом мне использовать эти десять библиотек вместе? Покажи, пожалуйста.

Я тебе объяснил, показываю наглядно.


Lib1 {} #--> foo
Lib2 {} #--> bar

Какие конфликты ты тут увидел? В твоем ЯП конфликты возникают исключительно из за того, что там нет нормального ООП.

anonymous ()
Ответ на: комментарий от anonymous

Я тебе объяснил, что в нормальном языке костыли не нужны. Все выражается естественным путем. Для подобных выкрутасов уже есть жаба.

Да не надо костылей. Предложенную задачу, пожалуйста, реши. Есть несколько библиотек, в каждой переопределяются скобки, я хочу использовать все библиотеки сразу. Приведи, пожалуйста, пример такого использования.

anonymous ()
Ответ на: комментарий от anonymous

Я тебе объяснил, показываю наглядно.

Покажи код библиотек lib1 и lib2, каждая из которых посвоему перегружает скобки, и код библиотеки lib3, которые использует ф-и одновременно lib и lib2. А то, что ты написал - это нелепая нерелевентная разговору хуета.

anonymous ()
Ответ на: комментарий от anonymous

Кто тебе мешает использовать их все сразу? Ты чо отмороженный чтоли?

anonymous ()
Ответ на: комментарий от anonymous

Ну так ты покажешь пример или нет?

anonymous ()
Ответ на: комментарий от anonymous

Какой пример? Ты рассуждаешь со своей быллячей колокольни, как тебе что то доказать можно? Я тебе объяснил, либа, это то же самое, что объект. У тебя может быть object1.foo и object2.foo вместе? Че тебе еще надо? Если нет ООП — то да, приходится извпащаться, изобретать уродливые костыли. В нормальном языке этого не нужно.

anonymous ()
Ответ на: комментарий от anonymous

Какой пример?

Я же написал:

Покажи код библиотек lib1 и lib2, каждая из которых посвоему перегружает скобки, и код библиотеки lib3, которые использует ф-и одновременно lib1 и lib2.

У тебя может быть object1.foo и object2.foo вместе? Че тебе еще надо?

Мне нужен код. Я выше описал, какой код. Нелепые рассуждение без кода ничего не стоят.

anonymous ()
Ответ на: комментарий от anonymous

Ты не можешь понять, эту хрень, потому что у тебя лисп/жаба головного мозга. В ооп, каждая функция имеет свой контекст исполнения. Не может там быть никаких конфликтов, потому что объеткы получатели сами все разруливают.


O := Object clone do(
 test1 := method(a,b,c, write({a,b,c}))
 test2 := method(a,b,c, write([a,b,c]))
)

o1 := O clone do(
 curlyBrackets := method(call evalArgs)
)

o2 := O clone do(
 squareBrackets := method(call evalArgs)
)

o1 test1(1,2,3)
o2 test2(1,2,3)

#>>>> list(1, 2, 3) list(1, 2, 3)

Если сделать наоборот, будет эксепшн.

anonymous ()
Ответ на: комментарий от anonymous

Ты редкостный недоумок. Макросы никакого отношения к лени не имеют. Макросы используются для реализации eDSL.

anonymous ()
Ответ на: комментарий от anonymous

Неправильно. Еще раз - сделай библиотеку lib1, в которой перегружены скобки и реализована ф-я с использованием этих скобок, библиотеку lib2, в котором _те же самые скобки_ перегружены по-другому и реализована ф-я, использующая эти скобки, и покажи пример одновременного использования ф-й из обеих библиотек.

Как я понимаю, даже столь примитивная задача в ИО неразрешима?

anonymous ()
Ответ на: комментарий от anonymous

Макросы используются в качестве суррогата лени.

Не путай макросы и fexpr'ы.

Когда выполняются макросы, никаких значений у параметров макроса ещё нет — он выполняется над AST

monk ★★★★★ ()
Ответ на: комментарий от anonymous

Чтобы было понятнее даже такому дебилу как ты, на примере. Мне от тебя требуется:

O1 := Object clone do(
 curlyBrackets := method(call evalArgs)
 test1 := method(a,b,c, write({a,b,c}))
)

O2 := Object clone do(
 curlyBrackets := ... //какая-то другая реализация
 test2 := method(a,b,c, write({a,b,c}))
)

import O1, O2 //необходимо добавить test1/2 пространство имен
test1(1,2,3)
test2(1,2,3)
anonymous ()

Имеется в виду, что этот синтаксис прост и фактически без особых изменений определяет AST?

this.
man CST, конкретный синтаксис.

anonymous ()
Ответ на: комментарий от monk

Я и не путаю. AST доступно как fexpr'ам так и макросам, разница в том, что макросы существуют только в компилтайме. Макросы — это суррогат fexpr'ов.

anonymous ()
Ответ на: комментарий от anonymous

Ты дебил, не понимаешь, что в Ъ нет никакого просто «пространства имен», там нет того, что быдло называет «глобальной областью». У тебя библиотека — это объект, и все есть объект, и у акждого объекта все есть неймспейс. А ты, идиот, предлагаешь полную чушь, ты говоришь, типа, давай у нас имя foo будет означать и 1 и 2 одновременно, в одном и том же контексте. Я тебе говорю, лечись от своих жабалиспов, пока не поздно.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.