LINUX.ORG.RU

Readable Lisp S-expressions Project

 


0

3

Галактеко, а вы знаете что есть такой вот проект:

The goal of this “Readable Lisp s-expressions” project is to develop, implement, and gain widespread adoption of more readable format(s) for the S-expressions of Lisp-based languages (such as Common Lisp, Scheme, Emacs Lisp, and Arc). We’ve done this by creating new abbreviations that can be added to existing readers. Curly-infix-expressions add infix expressions (in a Lispy way), neoteric-expressions also add more traditional function call notation, and sweet-expressions also add deducing parentheses from indentation.

Во что эти люди превратили Лисп? — спросите вы. Вот в это, например:

Awkward S-expression:

(define (factorial n)
  (if (<= n 1)
    1
    (* n (factorial (- n 1)))))

Improved Sweet-expression:

define factorial(n)
  if {n <= 1}
    1
    {n * factorial{n - 1}}
    (define (add-if-all-numbers lst)
      (call/cc
       (lambda (exit)
         (let loop ((lst lst) (sum 0))
           (if (null? lst) sum
             (if (not (number? (car lst))) (exit #f)
               (+ (car lst) (loop (cdr lst)))))))))


     define add-if-all-numbers(lst)
       call/cc $ lambda (exit)
         let loop (lst(lst) sum(0))
           if null?(lst)
             sum
             if not(number?(car(lst)))
               exit #f
               {car(lst) + loop(cdr(lst))}

В какой-то питон.

Пример реального кода.

Дискас, что ли.

Ухты, лиспитон

Deleted
()

1) ересь

2) в лиспе, в отличие от, отступы не захардкодены

lazyklimm ★★★★★
()

Зачем нужен лисп без смайликов?

dmfd
()

Был нормальный лисп, а сделали какой-то питон.

Artificial_Thought ★★★★
()

не нужно,

руки прочь от тёплых ламповых лиспов :)

Harald ★★★★★
()

Мало ли извращенцев? Ты еще на PFront посмотри, это peg-морда к Лиспу.

anonymous
()

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

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

в rkt только [] юзается для вложенных биндингов, это в clojure извращаются с синаксическим сахаром.

x4DA ★★★★★
()

Не нужно же! Дилан вот наоборот собираются возвращать к скобочкам.

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

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

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

Понимаю, я тоже от этого был первый месяц в шоке. Но я не помню когда я видел последний раз неотформатированный код. Иногда баги бывают при копи-пасте, особенно из браузера.

Так что я бы сказал это инстинкт самосохранения срабатывает («а вдруг это сломается»).

true_admin ★★★★★
()

Мне нравится. Во всех отношениях лучше с отступами, чем со скобочками.

anonymous
()

ИМХО, конечно, но читаемости это не добавляет.

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

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

Почему? Так или иначе (хороший) код всегда форматируется безотносительно того, соблюдает ли данный язык layout rule.

theNamelessOne ★★★★★
()

И как теперь писать макросы?

feofan ★★★★★
()

А в чем разница-то? Код же одинаковый абсолютно что там что там.

anonymous
()

Дискас, что ли.

Какой в жопу дискас? Где ты был последние лет 50? С подобной ерундой (самый мягкий приходящий на ум эпитет) различные «чудаки на букву М» пытаются открыть миру глаза с того самого момента, как в лиспе появилась возможность на ходу менять «райдер».

Это даже не «открыл Америку», это скорее очередная попытка доказать, что на гигиенических процедурах можно сэкономить кучу времени и средств, а на побочные эффекты НАСРАТЬ.

yyk ★★★★★
()

А смысл? Неужто кто-то видит существенную разницу между этими двумя вариантами кода?

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

Ерунда. Там надо end'ы писать.

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

Угу, вместо скобок вложенность сидит на отступах.

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

dave ★★★★★
()

ок, как теперь они предлагают пользоваться макросами CL?

и да, более бессмысленно потраченного времени программиста сложно придумать

pseudo-cat ★★★
()
Ответ на: комментарий от dave

зачем-то считают скобки

Таким даунам вообще думать противопоказано, не то что на Лиспе писать.

anonymous
()

Я - за синтаксис Паскаля или С, или Бейсика. Или 1С - это Бейсик, но у него точки с запятой, как в С.

Лично я считаю маразмом, что let, flet, macrolet порождают уровни вложенности отступов и работаю по-другому:

http://code.google.com/p/def-symbol-readmacro/wiki/proga

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

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

Инфиксная запись - тоже хорошо.

Аргументы по поводу затруднений макросов мне никогда не были ясны. Квазицитирование можно делать на уровне текста, например, так:

defmacro m(x,&body body)
quasiquote(
dim unquote(x) as int = 5;
splice(body)
          )
endmacro;

Если надо подсахарить,то так:

defmacro m(x,&body body)
<`var <x> as int = 5;
<=body=>`>
endmacro;

Может, не так элегантно, как в CL (не видна структура дерева), но макросы мы пишем не так часто и занимают они не такую большую долю кода.

Но конкретно этот проект мне не нравится питонистостью. И вообще, некогда этим заниматься.

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

Лично я считаю маразмом, что let, flet, macrolet порождают уровни вложенности отступов

Вложенность отступов порождают не let/flet/etc сами по себе, а создание вложенного лексического контекста. А делать вложенный контекст без отступов - вот как раз это маразм.

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

создание вложенного лексического контекст

Пусть он неявно создаётся в компиляторе. Зачем его рисовать в тексте? И так ясно: объект определён от точки определения и ниже, до конца текущего контекста, задаваемого блоком или чем-нибудь ещё.

В С++, в человеческих языках, в лиспе на уровне файла по отношению к defvar-ам этот принцип прекрасно работает, почему внутри функции должно быть по-другому?

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

Пусть он неявно создаётся в компиляторе. Зачем его рисовать в тексте? И так ясно: объект определён от точки определения и ниже, до конца текущего контекста, задаваемого блоком или чем-нибудь ещё.

Тогда не будут работать взаимо-рекурсивные определения:

(define (even? n) (or (zero? n) (odd? (- n 1)))
(define (odd? n (even? (- n 1))))
В твоем варианте работать не будет.

Собственно, ни один из распространенных языков не вводит, как ты предлагаешь, контекст вниз «неявно». Ну потому что это неудобно, глупо, нелогично. Так с чего в лиспе вводить такой идиотизм?

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

В С++, в человеческих языках

Назови хоть один. Везде (в с++ в том числе) контекст определяется явно, а определения в рамках блока имеют семантику letrec'a (то есть определение нового идентификатора никаких контекстов не создает - везде ровно один контекст на блок, чтобы создать новый контекст - надо вводить новый блок, все как в лиспе).

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

Назови хоть один.

Русский.

везде ровно один контекст на блок

С++ , цитирую какую-то страничку.

Переменные, объявленные внутри блока (на внутреннем уровне) имеют областью видимости блок. Область видимости блок начинается объявлением идентификатора и заканчивается конечной правой фигурной скобкой блока.

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

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