LINUX.ORG.RU

Синдром Эллочки-людоедки и lisp

 


3

4

В целом, мне нравится lisp - импонирует сама концепция lisp-a, я без особых проблем читаю s-выражения, нравиться его поддержка в emacs. И я использую emacs lisp как язык для всякой мелочевки.
С другой стороны простота концепции, когда первый аргумент s-выражения - функция, а остальные єлементы - параметры, имеет свой неприятный побочный эффект: огромное, неструктурированное пространство имен. Примерно за это я не люблю python - надо помнить кучу тонких особенностей и фич языка. А в lisp надо помнить кучу нужных функций. В книжке Грема их приблизительно 1000. В противопложность java - минимум ключевых слов, а вся функциональность вынесена в методы, которые выясняются по автодополнению и доктипу.
Второй нюанс, ХЗ, может зависит от конкретной реализации. Все функции из заргуженных пакетов валятся в одно пространство имен. Т.е. если Васян по глупости или злому умыслу перепишет стандартный car можно поиметь проблем, особенно если такой car подгружаю в составе какой-то библиотеки. Хотелось бы импорта a-la python import my-package as mp с последующим доступом типа (mp.foo).
Собственно, вопрос. Как борются с этими проблемами местные лисперы. Особенно с первой. Лично я запомнил около полусотни функций, примерно из списка снипеттов, к части прибавляю p и автоматом получаю знание новых. Может есть компактный список must know функций как перечень самых популярных коменд для emacs?
Вторая проблема больше для собственного кругозора, я сомневаюсь, что буду в большой команде использовать lisp, та и не годиться он для этого.

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

★★★★

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

Смотрю его книгу:
На страницах 53-54
на странице 57

Смотрю его код. И вижу у класса chunked-stream метод chunked-stream-stream, у класса chunked-input-stream методы chunked-stream-input-chunking-p, chunked-stream-input-index, chunked-stream-input-limit, chunked-input-stream-extensions, chunked-input-stream-trailers...

Так что не надо своё мнение приписывать известным людям.

Как видишь, это не только моё мнение.

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

chunked-input-stream методы chunked-stream-input-chunking-p, chunked-stream-input-index, chunked-stream-input-limit

Вот Вам и контрпример прямо в Вашей цитате: методы не начинаются на chunked-input-stream. Префикс к обобщённым функциям бывает, если он определяет протокол, к которому относятся функции. Но не класс.

P.S. Нашёл, кто придерживается Вашей точки зрения.

Accessor names generally follow a convention of <protocol-name>-<slot-name>, where a «protocol» in this case loosely indicates a set of functions with well-defined behavior.

...

By default, an abstract base class name is used as the notional protocol name, so accessor names default to <class-name>-<slot-name>; while such names are thus quite prevalent, this form is neither required nor even preferred. In general, it contributes to «symbol bloat», and in many cases has led to a proliferation of «trampoline» methods.

...

You must not use generic functions where there is no notional protocol. To put it more concretely, if you have more than one generic function that specializes its Nth argument, the specializing classes should all be descendants of a single class. Generic functions must not be used for «overloading», i.e. simply to use the same name for two entirely unrelated types.

More precisely, it's not really whether they descend from a common superclass, but whether they obey the same «protocol». That is, the two classes should handle the same set of generic functions, as if there were an explicit DEFGENERIC for each method.

(с) https://google.github.io/styleguide/lispguide.xml?showone=CLOS#CLOS

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

методы не начинаются на chunked-input-stream.

Во-первых, часть методов начинается: chunked-input-stream-extensions, chunked-input-stream-trailers. Во-вторых, другая часть методов начинается с chunked-stream - но у него там и класс такой есть под названием chunked-stream, который является родительским для chunked-input-stream. Почему автор не поместил эти методы в родительский класс - вопрос к нему как к проектировщику. Я считаю, что он не прав, но это такое.

P.S. Нашёл, кто придерживается Вашей точки зрения.

А, ну вот :-) Хотя я, честно-честно, не имею к тем ребятам отношения :-)

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

часть методов начинается

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

Например, есть рекомендуемый другими уважаемыми людьми метод называния аксессоров <field>-of.

Что касается префикса-протокола, то в новых библиотеках стараются протокол указывать в имени пакета, а не в имени функции. То есть вместо chunked-stream-input-chunking-p должно быть chunked-stream:input-chunking-p.

monk ★★★★★
()

Если Васян напишет говнокод на любом другом языке, то принципиально ничего не изменится. Общелисп требует достаточно сильной самодисциплины для хорошего кодоклепания в виду низкой степени анальной огороженности (хочешь в конпелятор залезть? да ради богов!).

Эх, загрузить из файла или по сети неведомое описание на DSL и наметаконпелировать классы и всякое такое в свой пакет, а потом просто всё махом грохнуть, и как-будто ничего не было, и вот прям щас загружай по-новой - счастье! И некоторые программки на DSL расширяли сам движок DSL, привнося нужные себе фичи, которые в изначальной архитектуре предусмотрены не были, и это тоже потом откатывалось в исходный вид. Адепты C++ и XML вдвоём это за полтора года не смогли переписать на «нормальных технологиях», так оставили :)

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

А как ты запоминал 100500 функций базовой поставки? Или просто самое необходимое, а остальное гуглил?

И, чтоб 2 раза не вставать: ты такой вот use case emacs-а не используешь А как вы используете emacs? ?

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

А как ты запоминал 100500 функций базовой поставки? Или просто самое необходимое, а остальное гуглил?

В основном, всё самописное в конторе было. Александрию и т.п. не пользовались. Моменты по взаимодействию с осью, FFI, мультипроцессингу и особенностями имплементации (LW) смотрел в официальной документации. Автокомплитом того, не знама чаво, никогда не пользовался, даже когда на плюсах тыкал. Так же, как и дебаггером для пошаговой отладки или даже брейкпойнтов.

И, чтоб 2 раза не вставать: ты такой вот use case emacs-а не используешь А как вы используете emacs? ?

10 лет назад я в Емаксе делал всё, даже читал почту и смотрел сайты (когда вебдваноль в файерфоксе надоедал вконец). Ну терминалов ещё пачка была открыта, в Емаксе это неудобно. Сейчас почти вся работа в консоль перекочевала, Емаксом пользуюсь, как чуть более удобным mcedit'ом.

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

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

А какую это все приносило практическую пользу?

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

Да какая нафиг анонимность, это всем известный Серёжа Марков же. И он просто ужас какой говнокодер.

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

А какую это все приносило практическую пользу?

One ring to rule them all. Одна софтина все текущие и будущие варианты ПЛИС-прошивок поддерживала, и имела одинаковый набор фич для всего.

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

Вот приведенные функции ни разу не интуитивные, надо прочитать приблизительно 100-страничный мануал и не забыть, что о чем-то таком в нем упоминалось.

cheat sheet выше с 26 страницами.

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