alar ([info]nealar) wrote,
@ 2009-06-18 21:39:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Entry tags:lisp, вопрос

L.I.S.P. Вопрос
К Scheme как-нибудь можно прикрутить удобный синтаксис?
Может, можно сделать "автоподставлятор скобок", и в каких-то местах их не писать?
Суть задачи в том, что:
1. надо, чтоб код получился сочетаемым другим схемным кодом. То есть, "возьми другой язык" - не вариант.
2. Но руками пейсать код на этом языке роботов - это мазохизм. Хочется немного подточить синтаксис: мнемоники понятные сделать, скобки куда-нибудь убрать.... Короче, предпроцессор. Желательно при этом не изобретать велосипед, а погнуть уже готовый.




(42 comments) - (Post a new comment)


[info]deni_ok
2009-06-18 05:52 pm UTC (link)
Можно идти за попкорном?

(Reply to this) (Thread)


[info]nealar
2009-06-18 07:54 pm UTC (link)
ага :)

(Reply to this) (Parent)


[info]nealar
2009-06-18 07:55 pm UTC (link)
Хотя я серьёзно.

(Reply to this) (Parent)


[info]potan
2009-06-18 07:36 pm UTC (link)
На то и дан define-macro.
А какой синтаксис удобен?

(Reply to this) (Thread)


[info]nealar
2009-06-18 07:58 pm UTC (link)
Более C-подобный. Например, как в хаскеле.
Я тут прикинул: наиболее близкий к лиспу синтаксис мне попадался в PostScript. Так ведь даже там скобок меньше!

(Reply to this) (Parent)(Thread)


[info]migmit.vox.com
2009-06-18 08:09 pm UTC (link)
PostScript - это такой Forth, на самом деле.

(Reply to this) (Parent)(Thread)


[info]nealar
2009-06-18 08:21 pm UTC (link)
Да. С полиморфизмом и first-class functions.

(Reply to this) (Parent)


[info]migmit.vox.com
2009-06-18 07:55 pm UTC (link)
Теоретически - можно. На лиспе всё можно, до тех пор, пока тебе не надо взаимодействовать с другими девелоперами, которые радостно нарушат любые предположения о входных данных и о порядке вызова, бывшие у тебя в неявном виде.

(Reply to this) (Thread)


[info]nealar
2009-06-18 07:59 pm UTC (link)
А как же лисподевелоперы взаимодействуют между собой?

(Reply to this) (Parent)(Thread)


[info]migmit.vox.com
2009-06-18 08:09 pm UTC (link)
А они делают не всё, что можно.

(Reply to this) (Parent)


[info]thesz
2009-06-18 08:24 pm UTC (link)
Да. ;)

(Reply to this) (Thread)


[info]nealar
2009-06-18 08:36 pm UTC (link)
Не понял.

(Reply to this) (Parent)(Thread)


[info]thesz
2009-06-18 09:09 pm UTC (link)
Меня сегодня чуть не уговорили на hs-plugins.

(Reply to this) (Parent)(Thread)


[info]nealar
2009-06-19 08:47 am UTC (link)
А что это?

(Reply to this) (Parent)(Thread)


[info]kashnikov
2009-06-19 04:34 pm UTC (link)
О! Это магия! ;-) На самом деле весьма прикольная штука. Я правда с ней познакомился практически с нулевым уровнем знания Haskell :-(
Зато на мой вопрос - "Какого фига не работает", пофиксали практически через день :)

(Reply to this) (Parent)(Thread)


[info]nealar
2009-06-19 04:44 pm UTC (link)
Чёрная? :)

(Reply to this) (Parent)(Thread)


[info]kashnikov
2009-06-19 04:48 pm UTC (link)
Я пока не понял. Но вполне вероятно =) Это Вам Сергей скорее скажет ;-)

(Reply to this) (Parent)(Thread)


[info]thesz
2009-06-19 07:16 pm UTC (link)
Меня не уговорили на использование hs-plugins. ;)

(Reply to this) (Parent)


[info]thesz
2009-06-19 07:15 pm UTC (link)
Подкачка кода на Си и Хаскеле в Хаскельную программу.

(Reply to this) (Parent)


[info]nivanych
2009-07-14 09:00 am UTC (link)
Скажи, пожалуйста, чем плохо
применение hs-plugins для веба?
Имеется ввиду, обновление кода отдельных страничек,
не перегружая FasyCGI'шку для всего сайта?
Мне кажется, что ничем не плохо.

(Reply to this) (Parent)


(Anonymous)
2009-06-19 07:11 am UTC (link)
Indentation-sensitive syntax (http://srfi.schemers.org/srfi-49/srfi-49.html)
только это совсем неудобно %)

(Reply to this) (Thread)


[info]nealar
2009-06-19 08:46 am UTC (link)
Табы вместо скобок? Но это полумера, да и не всегда удобно.

(Reply to this) (Parent)


[info]grundik
2009-06-19 01:26 pm UTC (link)
Если настолько не нравится синтаксис - лучше взять другой язык. В схеме и так несовместимостей самой с собой хватает.

Автоподставлятор скобок есть в emacs. quack-mode, например.

Накручивать reader-macro - это примерно как разноцветной изолентой ручки плоскогубцев обматывать для красоты. Ну то есть можно, конечно, и наверное эстетически оправданно, но лучше от этого плоскогубцы работать не будут.

(Reply to this) (Thread)


[info]nealar
2009-06-19 02:48 pm UTC (link)
Если ручки совсем никогда не обматывать, то надо писать на асме. gas, к примеру, даже немножко переносимый.
Лисп, _как_он_есть_ - это язык для роботов. Я писал на языках для роботов, и много, но это было в прошлом веке. Лучше работать схема от украшательств не начнёт, это естественно. Главное, чтоб не начала работать хуже.
Автоподставлятор скобок, когда пишешь исходник, должен комплектоваться автоубиратором скобок, когда его просматриваешь. :)

(Reply to this) (Parent)


[info]banan
2009-06-20 01:32 pm UTC (link)
прийти сюда и обозвать всех роботами — это сильно

могу лишь посоветовать маленькую книжку «Little Lisper», состоящую целиком из простых упражнений на лиспе — для быстрого привыкания к смайликам

(Reply to this) (Thread)


[info]kurilka
2009-06-20 01:48 pm UTC (link)
А куда "сюда"?
Вроде человек в свой журнал пишет и уж в нём-то имеет право высказывать свою точку зрения, какой бы она не была.
Или как в http://xkcd.com/386/ ?

(Reply to this) (Parent)(Thread)


[info]banan
2009-06-20 01:50 pm UTC (link)
упс. перешел сюда с какой-то из планет, думал, что это ru_lambda

это лишнее доказательство, что я не робот

(Reply to this) (Parent)(Thread)


[info]beshenov
2009-07-01 02:56 pm UTC (link)
Не вижу особой разницы между тематическим сообществом и планетой.

(Reply to this) (Parent)(Thread)


[info]banan
2009-07-01 03:56 pm UTC (link)
как в этом случае, автор может быть не в курсе, что его критикуют за появление поста в планете, хотя пишет он в личный журнал

(Reply to this) (Parent)(Thread)


[info]nealar
2009-07-01 04:36 pm UTC (link)
Моя - в планете? Где посмотреть?

(Reply to this) (Parent)(Thread)


[info]banan
2009-07-01 04:51 pm UTC (link)
у меня лента на яндексе, там несколько планет, сообществ и пр.
выяснять, как именно сюда пришел, долго и муторно, давайте не будем

(Reply to this) (Parent)


[info]beshenov
2009-07-01 05:22 pm UTC (link)
Видимо, http://planet.defun.ru/

(Reply to this) (Parent)


[info]beshenov
2009-07-01 05:32 pm UTC (link)
Я не критикую :-) Кому-нибудь может быть интересно или полезно посмотреть обсуждения и поучаствовать. Это же не секта лисперов.

(Reply to this) (Parent)


[info]beshenov
2009-07-01 05:33 pm UTC (link)
XKCD тут будет к месту:

(Reply to this) (Parent)


[info]nealar
2009-06-20 08:08 pm UTC (link)
1. Заявление, что у меня тут ru_lambda - это дико лестно, но
2. Роботами я никого не называл. Читайте внимательней. ;)

(Reply to this) (Parent)


[info]beshenov
2009-07-01 02:54 pm UTC (link)
Забавный вопрос. Во всех языках есть свои элементы стиля, которые теоретически можно и не принимать, но тогда ничего хорошего не выйдет. Если какой-то язык не нравится на уровне базового синтаксиса и семантики, то проще найти другой.

(Reply to this) (Thread)


[info]nealar
2009-07-01 03:28 pm UTC (link)
Семантика как семантика, вполне себе такая семантичная. А вот синтаксис!

(Reply to this) (Parent)(Thread)


[info]beshenov
2009-07-01 05:23 pm UTC (link)
Вообще-то, синтаксис отвечает задачам метапрограммирования.

(Reply to this) (Parent)(Thread)


[info]nealar
2009-07-03 03:47 pm UTC (link)
То есть, для роботов. Чтоб им было удобно манипулировать лиспокодом. А для людей что?

(Reply to this) (Parent)(Thread)


[info]beshenov
2009-07-03 04:42 pm UTC (link)
А язык логики первого порядка --- он для людей? А Z-нотация? А синтаксис лямбда-исчисления?

В математике и информатике любая нотация в общем смысле естественной не является. Но удачная нотация всегда не слишком сложная и удачно соотносится с семантикой конкретной области.

Синтаксис Лиспа очень простой (простой именно для людей, а не для разбора). Кроме того, он удачно отражает тот факт, что код на языке укладывается в его же базовую структуру данных.

Если вам это кажется очень неудобным, то найти другой язык проблем не составит. Правда, если изъять S-выражения и метапрограммирование, то это будет вовсе не Лисп.

(Reply to this) (Parent)(Thread)


[info]nealar
2009-07-03 05:37 pm UTC (link)
1. Язык логики. Изобретался людьми и для людей. Насколько мне известно, для роботов его синтаксис приходится адаптировать.
2. Z-нотация
Это чево?
3. Синтаксис лямбда-исчисления. Роботам с ним работать явно проще, чем людям. Поэтому в языках программирования его адаптируют различными украшательствами.
4. Кто здесь говорит о "естественности нотаций"? Зачем?
5. удачно отражает тот факт, что код на языке укладывается в его же базовую структуру данных.
Каким образом? Зачем вообще это надо отражать в синтаксисе? На случай, если программист вдруг забудет? :)
6. Если вам это кажется очень неудобным, то найти другой язык проблем не составит.
Сменить операционную систему, компутер, страну пребывания и ДНК. Это да, традиционные способы ответа на любые вопросы.
N+1. Синтаксис Лиспа очень простой
Возможно, я не те книжки читал, но так и не смог врубиться, где надо ставить ' и зачем, а где не надо. () - запомнить легко и легко использовать, читать не очень легко. Новичкам в языке приходится ведь не только писать свой код, но и читать его. Это профи пишут один раз - и у них всё работает. И всякие такие мелкие моменты там везде. А в основном - да, синтаксис очень логичный.

(Reply to this) (Parent)(Thread)


[info]beshenov
2009-07-03 07:45 pm UTC (link)
Это чево?

http://tinyurl.com/madkdg ;-)


Синтаксис лямбда-исчисления. Роботам с ним работать явно проще, чем людям. Поэтому в языках программирования его адаптируют различными украшательствами.

Лямбда-исчисление --- это удобная математическая формализация вычислений с удобным и простым синтаксисом. Просто для практического программирования к нему нужно добавить всяческий сахар.


Сменить операционную систему, компутер, страну пребывания и ДНК. Это да, традиционные способы ответа на любые вопросы.

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


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

Это один из важных базовых моментов. SICP далеко не про конкретный язык программирования, но понятное неформальное изложение основных вещей там, вроде, есть (а также про метациклический интерпретатор и другие интересные штуки).

Краткое объяснение quote, на всякий случай.


Многие объекты могут вычисляться, а могут представлять данные сами по себе. В частности, под символом foo можно иметь в виду как привязку имени foo к определенному значению, так и само имя. Если подразумевается имя, то указывается 'foo (либо (quote foo), что идентично).

(let ((foo 0)) foo) => 0
(let ((foo 0)) 'foo) => foo

quote часто используется со списками. (+ 1 2) может обозначать как применение + к аргументам 1, 2, так и список с элементами +, 1, 2. Если подразумевается список, то указывается quote.

(+ 1 2) => 3
'(+ 1 2) => (+ 1 2)

`foo (или (quasiquote foo)) работает для списка или вектора foo как quote, но только не действует на те элементы, которые указаны в виде ,bar (или (unquote bar)) --- то есть, ,bar внутри quasiquote вычисляется:

'(a b (+ 1 2)) => (a b (+ 1 2))
`(a b ,(+ 1 2)) => (a b 3)

Помимо unquote есть unquote-splicing (короткая запись ,@bar) --- используется для вставки результата-списка в объемлющий список:

`(a b ,(cdr '(b c d))) => (a b (c d))
`(a b ,@(cdr '(b c d))) => (a b c d)

С векторами работает аналогично:

`#(a b ,@(cdr '(b c d))) => #(a b c d)

В общем, quote требуется в тех местах, где объект не должен вычисляться, а quasiquote --- там, где нужно создать список или вектор, некоторые элементы которого нужно вычислить. (Если вычислить нужно все, то используется (list ...) и (vector ...), если никакие, то quote)

(Reply to this) (Parent)


(42 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…