LINUX.ORG.RU

Концептуальный дистрибутив - почти lisp os? :)

 , , , ,


0

1

Всем привет. Не использовал Linux на десктопе несколько последних лет, но с 2011 активно использую на серверах (в основном debian), походу многое пропустил - и у нас появился (потенциально?) нормальный дистр, которым можно пользоваться? Речь о GuixSD. Почти lisp os, лол: guix один из самых продвинутых менеджеров пакетов (и не только?), shepherd - нормальный и переносимый вириант System V, stumpwm и next browser в активной разработке, emacs как ide.

Хотел узнать, на сколько актуально и какие юз-кейсы использования guix поверх других дистров, например gentoo, или arch? Кто совмещает с debian? Какие сейчас основные issues в проекте GuixSD? Чем shepherd лучше других систем инициализации, кроме того, что он на scheme, что само по себе огромный плюс?

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

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

Дефолтные настройки норм в 90% случаев, что мешает настроить форматер для парочки юз-кейсов? Каким ты пользовался и что тебе не понравилось?

И этот форматер узко специализирванный.

Чо?

Потому что лисп - это двоичное дерево с узлом (голова . хвост). Вот и всё его форматирование.

Ну конечно же нет. man iterate, есть куча примеров где это не так - макросы, clos итд.

Красиво выглядит двоичное дерево?

(-> "a b c d" 
           .toUpperCase 
           (.replace "a" "x") 
           (.split " ") 
           first)

Чем такой формат записи принципиально отличается от вызова методов через точку, кроме того что читаемость пропорционально растет количеству параметров вложенных аргументов (в случае лиспа конечно)?

Дальше форматировать можно только зная информацию о узлах, то есть надо знать то, что выше самого языка, надо знать решаемую задачу - «рисуешь» html или комбинируешь комбинаторы.

Не надо. Но если очень хочется, то можно.

Лисп - это не копромисный вариант. Это формат близкий к машине. Человеку это читать очень трудно без узко-специализированного как-бы ide.

Зачем программировать на лиспе без ide с репл? Лисп в блокноте не юзабелен.

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

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

Ну да, i мы можем вычислить до момента подстановки в longcomp, логично такое оптимизировать и не вычислять по N раз.

fib n = fib (n-2) + fib (n-1)

Стека не хватит или на что ты намекаешь? Мы можем хранить какое-то ограниченное множество последних вычислений для рекурсивных ф-ций.

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

Ну конечно же нет. man iterate, есть куча примеров где это не так - макросы, clos итд.

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

(-> "a b c d" 

Где лопата? Где надо останивиться смеятся?

Я конечно понимаю, что над профдеформацией нельзя смеятся. Но если смешно, то это смешно.

Лисп в блокноте не юзабелен.

Хоть признался.

Что, если это «дерево» в метапрог загнать? Можно же мышкой программировать! А? А? А?

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

i мы можем вычислить до момента подстановки в longcomp, логично такое оптимизировать и не вычислять по N раз.

Вот. Достаточно ли долго вычисляется longcomp, чтобы перед каждым его вызовом делать дополнительную проверку (i = 1?). А если у нас в области видимости N вызовов вида (longcomp i), то перед каждым придётся делать до N-1 сравнений.

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

Это противоречит требованию «гарантия максимум однократной эвалюации синтаксически тождественных выражений».

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

Причём, если делать тотальную мемоизацию, то надо требовать реализацию Eq для всех типов языка, причём с выполнением всех свойств (транзитивность, рефлексивность, …).

В Haskell даже для Double

Prelude> let x = 0 :: Double
Prelude> let y = -0 :: Double
Prelude> x == y
True
Prelude> recip x == recip x
False
Prelude> let z = (0/0 :: Double)
Prelude> z == z
False
monk ★★★★★
()
Ответ на: комментарий от anonymous

Давай, еще перечисли узкоспециализированные примеры для конкретных реализаций языка со своими расширениями.

При чем тут узкоспециализированность вообще? Это просто _пример_, что там где удобно - мы используем не только нотацию (f arg1 arg2 ...) именно для читабельности, т.е. вводим и синтаксис (там где удобно) и новую семантику.

Только не говори, что для нормального форматирования этих раширений надо расширить еще форматировщик.

Пару (возможно, десятков) строчек написать это прямо «расширить»? :)

Где лопата? Где надо останивиться смеятся?

Что конкретно тебя развеселило?

Лисп в блокноте не юзабелен.

Хоть признался.

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

Что, если это «дерево» в метапрог загнать? Можно же мышкой программировать! А? А? А?

Эту тему тебе лучше обсудить в другом топике.

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

Это общеизвестный факт - что для разработки на лиспе строго необходима продвинутая ide

Зачем? На диалектах Scheme, например, прекрасно пишется без IDE.

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

fib n = fib (n-2) + fib (n-1)

Это говно, не пиши так! Лови веганский вариант:

Fib_ = fun F(0, X, _) -> X; F(1, _, Y) -> Y; (N, X, Y) -> F(N - 1, Y, X + Y) end.
Fib = fun(N) -> Fib_(N, 0, 1) end.
anonymous
()
Ответ на: комментарий от anonymous

Лови веганский вариант

Да понятно, что можно явный аккумулятор использовать. Речь про то, обязан ли компилятор автоматически такой аккумулятор создавать. Как использование индексов и кэширования в SQL.

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

Вот. Достаточно ли долго вычисляется longcomp, чтобы перед каждым его вызовом делать дополнительную проверку (i = 1?).

Ну если прям _long_comp и это заранее известно, то да. А так вообще можно сделать опциональный «декоратор», декорируешь только потенциально сложные вычисления (можно по предусловиям, т.е. в каких-то случаях декоратор будет сравнивать, в каких-то нет, в зависимости от предусловий и твоих задач).

А если у нас в области видимости N вызовов вида (longcomp i), то перед каждым придётся делать до N-1 сравнений.

Это ведь дешево, потому что _long_comp. При чем аргументы вычисляются единожды, затраты только на проверку эквивалентности. И затраты по памяти.

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

Это противоречит требованию «гарантия максимум однократной эвалюации синтаксически тождественных выражений».

"... там, где это возможно".

То есть пришли к тому, с чего начали. Haskell имеет право не вычислять повторно функции

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

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

А будет / не будет вычислять от фазы луны зависит? Какая логика?

Причём, если делать тотальную мемоизацию, то надо требовать реализацию Eq для всех типов языка, причём с выполнением всех свойств (транзитивность, рефлексивность, …).

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

В Haskell даже для Double

Ну да, в хаскеле криво сделано.

let z = (0/0 :: Double)

Здесь, кстати спорно, какое было бы более правильное решение, не вычислять (и тогда должно быть True), или сравнение (а может и само определение) должны вызвать эррор. Но точно не False, то есть в хаскеле кривизна кругом. Ну и что, мы ведь не предлагаем на хаскеле писать что-либо :)

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

Это общеизвестный факт - что для разработки на лиспе строго необходима продвинутая ide

Зачем? На диалектах Scheme, например, прекрасно пишется без IDE.

А как же автоформат, автозакрытие, подсветка скобочек, прыжки по определениям, repl? Не представляю как писать на лиспе без slime или его аналога.

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

Анонимус, а что ты хотел сказать, мы тут не самую корректную реализацию чисел фиббоначи обсуждаем вообще-то, а несколько другие вопросы :)

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

Да понятно, что можно явный аккумулятор использовать. Речь про то, обязан ли компилятор автоматически такой аккумулятор создавать. Как использование индексов и кэширования в SQL.

Да анон просто решил показать, что у тебя результаты будут некорректными для первых двух чисел :) Компилятор не может тут ничего «создать», если эту хрень хотя бы контрактами не обвесить, и то не сможет, потому что ниче не знает о частных случаях. В лучшем случае - укажет тебе, что у тебя ф-ция не для всего множества чисел (или что ты в контракте пропишешь) будет соответствовать контракту результата. Или что он тут еще может сам вывести? :)

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

Так тебе же выше уже ответили — ты лиспофанатик!

Присоединяйтесь, у нас есть печеньки ... и кластеры метапарадигм, во!

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

вводим и синтаксис (там где удобно) и новую семантику

Эта «новинка» бесплатна?

надо расширить еще форматировщик.

Пару (возможно, десятков) строчек написать это прямо «расширить»? :)

То есть не бесплатна. Надо и ide обновить и себя обновить на понимание этой «новинки».

Что конкретно тебя развеселило?

Всё, от натягивания совы ООП до построчного форматирования.

Это общеизвестный факт - что для разработки на лиспе строго необходима продвинутая ide

Вот именно. Без машиннной обработки лисп не юзабелен, от слова совсем. То есть язык для машины, а не для человека. Сперва машина должна переварить лисп-код, отформатировать и показать человеку. Да еще ввод человека должен автоматически корректировать. Иначе это мазохизм. Я лучше на верифицируемых языках буду писать и воевать с тайпчекером.

Теперь вопрос: нужен ли такой язык, который без ide страшен как черт, для написания конфигураций (несложных)?

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

вводим и синтаксис (там где удобно) и новую семантику

Эта «новинка» бесплатна?

Практически да, для пользователя «новинки» бесплатна вообще - только доку почитать, разраб должен будет написать симпотный макрос (это дешево).

надо расширить еще форматировщик.

Пару (возможно, десятков) строчек написать это прямо «расширить»? :)

То есть не бесплатна.

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

Надо и ide обновить и себя обновить на понимание этой «новинки».

Учиться это хорошо, да. ide придется обновить с эклипса на emacs. Зачем использовать технически отсталые инструменты, когда можно взять продвинутые?

Что конкретно тебя развеселило?

Всё, от натягивания совы ООП до построчного форматирования.

Расскажи, как использовать python / ruby без редактора с автоформатированием? Как работать с джавой без ide, которая помогает генерить бойлерплейт? В приведенном примере нету ооп, если что :) Просто композиция ф-ций. Но смотри как здорово выглядит - ты даже перепутал с точечным ооп, лол.

Это общеизвестный факт - что для разработки на лиспе строго необходима продвинутая ide

Вот именно. Без машиннной обработки лисп не юзабелен

Как и любой яп.

от слова совсем. То есть язык для машины, а не для человека.

Почему для машины? Читается как питон практически. Все языки потом транслируются в понятное для машины представление. Что сказать-то хотел?

Сперва машина должна переварить лисп-код, отформатировать и показать человеку.

С С++ иначе?

Да еще ввод человека должен автоматически корректировать.

man python / haskell, там отступы автоматом проставляют при переносе строки, где надо (и где не надо, лол).

Иначе это мазохизм. Я лучше на верифицируемых языках буду писать и воевать с тайпчекером.

Верифицируемых это как? :) При чем тут тайпчек, кроме лиспа куча языков с динамической типизацией.

Теперь вопрос: нужен ли такой язык, который без ide страшен как черт, для написания конфигураций (несложных)?

С чего бы вдруг он страшен? Редактировать не всегда удобно, читать вполне себе (лучше с подсветкой). На уровне конфигов и редактировать норм.

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

А так вообще можно сделать опциональный «декоратор»

И получаем define/memo из Racket.

А будет / не будет вычислять от фазы луны зависит? Какая логика?

От оптимизатора. Как в SQL использование индекса при проверке условия.

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

Внутри себя. Между собой они по определению не равны. В Haskell, например Eq не определён для функций. И определить для них равенство — задача нетривиальная. Если f x = x + 1 и g x = x + 2 - 1, то g == f?

Но точно не False, то есть в хаскеле кривизна кругом.

NaN не равен самому себе по стандарту IEEE 754. Хаскель в данном случае можно обвинить только в том, что Eq используется для арифметического сравнения. Возможно надо было сделать какой-то === для Eq и == для математики. Чтобы 0 === -0 была ложь, а NaN === NaN была истина.

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

до построчного форматирования.

Что еще за построчное форматирование? С переносом строк происходит автоформат, не нравится - поправил руками, не нравится часто - поправил форматтер. Не хочешь ничего править, пиши как попало нажал один хоткей тебе автоматом поправило *все* строчки в файле как _тебе_ надо.

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

И получаем define/memo из Racket.

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

А будет / не будет вычислять от фазы луны зависит? Какая логика?

От оптимизатора. Как в SQL использование индекса при проверке условия.

Ну, там же есть наверняка какой-то конкретный алгоритм. Или он очень сложный / фаза луны?

И определить для них равенство — задача нетривиальная. Если f x = x + 1 и g x = x + 2 - 1, то g == f?

На мой вкус, да. Мы ведь не сравниваем их эквивалентность по коду, а только по вычислимому результату.

Но точно не False, то есть в хаскеле кривизна кругом.

NaN не равен самому себе по стандарту IEEE 754.

А то, что там деление на ноль к ошибке не приводит это норм, just as planned? Для меня деление на ноль это NaN _только_, если ты так захотел, а вообще должно эксепшн кидать.

Хаскель в данном случае можно обвинить только в том, что Eq используется для арифметического сравнения. Возможно надо было сделать какой-то === для Eq и == для математики. Чтобы 0 === -0 была ложь, а NaN === NaN была истина.

Ну в лиспе есть разные eq, если надо можно еще наплодить любых.

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

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

Вот написал ты супер-пупер синтаксический макрос. Как к такому макросу отнесутся ide (надеюсь, не построчно отформатирует), коллеги (ногами не запинают), ты сам через пару месяцев (самобичевание - грех)?

Как и любой яп.

Максимум нужна подсветка синтаксиса. И то часто мешает - в глазах рябит.

Почему для машины? Читается как питон практически.

«Лисп ситается как питон». В лиспе нет форматирования, от слова совсем. Тем временем символы форматирования входят в синтаксис языка питон. Хватит уже натягивать.

С С++ иначе?

Было время, когда с++ мало какой ide переваривал, сейчас тоже не идеал. Проще (было) писать в блокноте, максимум простая подсветка синтаксиса.

man python / haskell, там отступы автоматом проставляют при переносе строки, где надо (и где не надо, лол).

Видно что ты сроднился с ide, прям врос. То что делает машина, тебе кажется, что ты делаешь сам.

приведенном примере нету ооп, если что :) Просто композиция ф-ций. Но смотри как здорово выглядит - ты даже перепутал с точечным ооп, лол.

А точки перед функциями зачем ставишь, почему не отдельно? Для того, чтобы краше было? Потому и смешно. Особенно смешно это выглядит с построчым форматированием. Прям слышно как трется при натягивании.

На уровне конфигов и редактировать норм.

Лисп? Как конфиг? Слышь, вылезай иногда из своего как-бе IDE!

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

Вот написал ты супер-пупер синтаксический макрос. Как к такому макросу отнесутся ide

Нормально, а что там относиться? Подсветят все что надо, дадут прыгнуть на определение, исправить, компильнуть, скобочки закроют :)

(надеюсь, не построчно отформатирует), коллеги (ногами не запинают), ты сам через пару месяцев (самобичевание - грех)?

Как и любой яп.

Максимум нужна подсветка синтаксиса. И то часто мешает - в глазах рябит.

Все ясно с тобой, с этого надо было начинать (можно было на этом и заканчивать).

В лиспе нет форматирования, от слова совсем. Тем временем символы форматирования входят в синтаксис языка питон. Хватит уже натягивать.

Есть форматирование в лиспе, с таким же успехом его «нет» в С или JS - пиши все в одну строчку.

Было время, когда с++ мало какой ide переваривал, сейчас тоже не идеал. Проще (было) писать в блокноте, максимум простая подсветка синтаксиса.

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

Видно что ты сроднился с ide, прям врос. То что делает машина, тебе кажется, что ты делаешь сам.

А еще вокруг ос, компиляторы, библиотеки - ужос, а мне казалось, что все сам да сам :(

А точки перед функциями зачем ставишь, почему не отдельно? Для того, чтобы краше было?

Нет, потому что это пример на clojure, и точки указывают на то что вызываются джава методы. Да, сделано для наглядности, совместимости и отличимости java-методов от ф-ций кложи. Но ооп тут нет, несмотря на точки. Но смотри как купился. Сила DSL!

Потому и смешно. Особенно смешно это выглядит с построчым форматированием. Прям слышно как трется при натягивании.

Что у тебя за фиксация на построчном_форматировании ты уже можешь рассказать или нет?

Лисп? Как конфиг? Слышь, вылезай иногда из своего как-бе IDE!

Ну да, код как данные, лисп как конфиг :)

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

Максимум нужна подсветка синтаксиса. И то часто мешает - в глазах рябит.

Все ясно с тобой, с этого надо было начинать (можно было на этом и заканчивать).

Твое «всё ясно» больше говорит от тебе, и кому надо заканчивать.

Есть форматирование в лиспе, с таким же успехом его «нет» в С или JS - пиши все в одну строчку.

Прикинь, вполне можно писать в одну строчку вполне читабельную программу. Я бы посмотрел как ты будешь писать лисп-программу в одну строчку, как ты будешь считать скобки.

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

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

точки указывают на то что вызываются джава методы.

Но ооп тут нет, несмотря на точки.

Ты дурак? Нет, тут нужен восклицаельный знак.

А я было поверил что точка «.» - это реально композиция функций, как в нормальных языках.

Ну да, код как данные, лисп как конфиг :)

И все это только в как-бе иде. Вне иде нет жизни.

За мкадом жизни нет. Хотя ты не похож на москвича, скорее всего бандеровец

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

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

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

А я было поверил что точка «.» - это реально композиция функций, как в нормальных языках.

Композиция ф-ций, но не точка а "->".

Ну да, код как данные, лисп как конфиг :)

И все это только в как-бе иде. Вне иде нет жизни.

Это в коде.

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

:D Давай прощаться, а? :)

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

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

Я писал на guile без иде. Это мучение. С какбы иде тоже мучние, или я не смог в это иде. Понял что самобичевание - грех, и забросил.

Композиция ф-ций, но не точка а «->»

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

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

Давай прощаться, а?

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

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

С какбы иде тоже мучние, или я не смог

Скорее всего, какой редактор ты использовал? Нормальный вариант это только emacs + slime / slimv / cider / geise или аналоги для vim.

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

Окружение - оно под капотом, в примере последняя ф-ция без точки, ее применением ничем не отличается от применения метода.

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

Да так везде пишут и в руби и где угодно, тем более если в методах «паровозиком» много параметров.

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

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

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

emacs

Для которого конфиги на лисп. Чтобы нормально писать на на лисп нужен настроенный emacs. Порочный круг. Не нужен.

Окружение - оно под капотом

Но ооп никуда не делось.

в примере последняя ф-ция без точки, ее применением ничем не отличается от применения метода.

И что? Метод - это функция, первый параметр которого (this) задан как объект перед функцией-методом. Не буду копать в сторону таблицы виртуальных методов, а то слишком явно будет сквозить ООП.

если в методах «паровозиком» много параметров.

Их много? строка длинее 80 символов или 120 как принято жаверов?

Твой пример - это кривой костыль более короткого намного легче читаемого ООП варианта (псевдо жава, больше похоже на c#)

"a b c d".toupper().replace('a', 'x').split(' ').first()

Сравни свой костыль и нормальный человекочитаемый язык. Зачем ты показал этот позорный пример?

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

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

Ах, да, все программы пишутся на выброс - их когда-нибудь выбросят.

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

Чтобы нормально писать на на лисп нужен настроенный emacs. Порочный круг. Не нужен.

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

Но ооп никуда не делось.

Делось, в clojure _нет_ ооп. Это как сказать, что в С++ никуда не делся ассемблер.

в примере последняя ф-ция без точки, ее применением ничем не отличается от применения метода.

И что?

То, что это не ооп, а композиция функций.

если в методах «паровозиком» много параметров.

Их много? строка длинее 80 символов или 120 как принято жаверов?

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

Твой пример - это кривой костыль более короткого намного легче читаемого ООП варианта (псевдо жава, больше похоже на c#)

Это просто форма записи, читается она примерно одинаково.

«a b c d».toupper().replace('a', 'x').split(' ').first()

(-> «a b c d» .toUpperCase (.replace «a» «x») (.split " ") first)

Найди 10 отличий.

Сравни свой костыль и нормальный человекочитаемый язык. Зачем ты показал этот позорный пример?

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

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

Чтобы генерировать, очевидно, не нужна. Нужна для редактирования и чтения кода.

Ах, да, все программы пишутся на выброс - их когда-нибудь выбросят.

Однострочники на перл выбросят (или забудут о них почти сразу после написание), большие проекты типа Maxima - будут существовать десятилетиями.

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

То, что это не ооп, а композиция функций.

В первых - это не композиция функций. Это тупой последовательный вызов, как в тупом ООП-языке. Ты хоть знаешь что такое композиция функций? Как создается композиция функций в кложуре? Уверен, явно не такой конструкцией «(-> )».

проекты типа Maxima - будут существовать десятилетиями.

Я не знаю что такое Maxima, но если он существует десятилетиями, ты уверен что он написан на ide, а не простом редакторе уровня notepad, максимум турбопаскаль?

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

В первых - это не композиция функций. Это тупой последовательный вызов, как в тупом ООП-языке.

Это просто синтаксический сахар над обычной лисп-формой (f1 arg1 (f2 arg2 arg3 (f3 arg4))). Функции применяются последовательно, это и есть композиция.

Ты хоть знаешь что такое композиция функций? Как создается композиция функций в кложуре? Уверен, явно не такой конструкцией «(-> )».

Ну харе уже нести пургу, серьезно. Это эквивалент: (first (.split (.replace (.toUpperCase «a b c d») «A» «X») " ")). Или так, если форматирование:

(first (.split
           (.replace
                (.toUpperCase «a b c d»)
                «A» «X»)
           " "))

Я не знаю что такое Maxima, но если он существует десятилетиями, ты уверен что он написан на ide, а не простом редакторе уровня notepad, максимум турбопаскаль?

Раньше писали на чем было, а когда-то еще каменными топорами орудовали, ты луддист?

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

(f1 arg1 (f2 arg2 arg3 (f3 arg4)))

Теперь напиши правильно. Что идет первым аргументом для функций? Скобочки правильно раставь, лиспер хренов?

Композиция ли это функций? Или это какая-то хитрая «композиция» - тупой ооп-сахар?

Раньше писали на чем было, а когда-то еще каменными топорами орудовали, ты луддист?

Зачем ты привел этот пример? Односточник rm -rf / тоже долго живет, даже собственное имя имеет.

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

Или так, если форматирование:

Лучше бы не форматииовал. Настроенный у него какбы иде.

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

(f1 arg1 (f2 arg2 arg3 (f3 arg4)))

Что идет первым аргументом для функций? Скобочки правильно раставь, лиспер хренов?

Ты что уже не можешь посчитать 3 скобки слева и 3 справа? :) Каким еще аргументом, что тебе там «правильно» написать? Я привел эквивалент записи с "->", вот он еще раз, если у тебя выборочное чтение: (first (.split (.replace (.toUpperCase «a b c d») «A» «X») " ")), ты вообще читаешь на что отвечаешь?

Композиция ли это функций? Или это какая-то хитрая «композиция» - тупой ооп-сахар?

Открой уже доку какую-то, время пришло!

Зачем ты привел этот пример?

Ты не держишь в голове контекст дольше нескольких секунд. «Это... это печально» :)

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

Ах, да, все программы пишутся на выброс - их когда-нибудь выбросят.

Я привел пример программы на лиспе, которая живет десятилетиями, используется и развивантся. Но ты уже просто хочешь беседу свести к абсурду, что когда-нибудь и солнце потухнет и вселенная схлопнется. Мне не интересно это обсуждать. Задай вопрос по делу, я отвечу. Если нет - давай прощаться.

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

(first (.split (.replace (.toUpperCase «a b c d») «A» «X») " "))

Это ты правильно написал. Это не композиция функций.

Теперь напиши это через настоящую композицию comp (вроде так называется в кложуре).

(f1 arg1 (f2 arg2 arg3 (f3 arg4)))

Это не эквивалент твоему примеру. И это можно предствить как композицию (f3 . (f2 arg2 arg3) . (f1 arg)) arg4.

Я привел пример программы на лиспе, которая живет десятилетиями, используется и развивантся.

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

ты уже просто хочешь беседу свести к абсурду

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

Зачем то привел Maxima, который к тебе никаким боком не относится. И ide здесь не причем.

А патч Бармина - это уже абсурд.

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

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

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

Ты даже не понял, зачем в clojure comp - о чем с тобой говорить, ну серьезно? :) О том, что такое композиция ф-ций? :) Почитай доку и прихо^W ложись спать.

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

Щас бы читать документацию лиспа для лиспера.

По документации, comp возвращает функцию, которая есть композиция переданных функций. Что надо получить, если разговор про «композицию функций». Давай, вперед, действуй!

anonymous
()

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

Система описывается в одном лисповом модуле, определяющем объект operating-system. Ядро,файловые системы, пользователи, пакеты, сервисы с конфигами - всё там. Использование нормального языка программирования даёт нам модули, функции, переменные и прочие штуки,что даёт большую гибкость. Скажем, в одном месте список хостов в сети, а потом из них нагенерить конфиги dhcp, dns и nftables, или вынести общие для двух систем куски конфигурации в свой модуль. Всё это удобно хранить в гите, редактировать с десктопа конфиг ноута, а потом на ноуте пуллить и накатывать все изменения разом командой guix system reconfigure. Стоит отметить малое количество сервисов, а те, что есть, не всегда через лисповый интерфейс предоставляют все возможности. У какого-нибудь dnsmasq в конфиге миллион опций, прописать которые сейчас возможности нет. Нет сервисов для хитрых настроек сети типа «два интерфейса, три влана, бридж и туннель», нет сервисов для lvm2. Но их нет в стандартной поставке, потому что они должны быть достаточно общими для решения максимального круга задач. Написать пачку сервисов для конкретной ситуации можно элементарно, shepherd простой, как полено. Поначалу система совершенно непривычная - конфиги не на своих местах, а те, что на своих - readonly, но больших проблем у меня не вызвало.

Пакетов маловато, но из того, что нужно мне, есть почти всё. Если чего-то нет, то запакетировать можно очень быстро. Прямо сейчас у меня 20 написанных мной пакетов, сам не заметил, когда это всё написал. Ещё есть guix import, который генерит рецепт для пакета с pypi, hackage, melpa, cran, crate и всякого такого. То есть установка мусора с pypi требует минимум телодвижений, при этом мусор под контролем пакетного менеджера и не захламляет систему. virtualenv и им подобное становится ненужно. По сравнению с написанием рецепта для guix написание ебилда - мазохизм. Да, пакетирование чего-то для дебиана или шапки, на мой взгляд, давно пора приравнять к пыткам. Есть некоторые сложности, например,со scala. Парни из guix уверены, что всё должно раскручиваться из минимального блоба (в идеале в пределах 1KB), а скала собирается самой собой, да ещё для сборки использует sbt,написанную на себе же. Думаю, что при таком раскладе в апстрим в ближайшее время скала не попадёт. Но для ghc таки тащат блоб версии 7.8.4. То ли оно заехало, когда ещё не так упарывались по этим вопросам, то ли хаскелю доверяют больше, чем скале.

В общем, оно довольно сырое, но юзабельное. Ощущения примерно такие же, как когда 15 лет назад с венды свалил на слаку и постигал азы шелл-скриптов, /etc/rc.d и doinst.sh. Если есть работа, семья и нормальные хобби, то лучше проходить мимо. Если в кайф поковыряться в сырцах и завести то, не знаю что, туда, не знаю куда, то отличный вариант.

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

Привет, большое спасибо за отзыв. Мог бы ты уточнить несколько моментов?

По сравнению с написанием рецепта для guix написание ебилда - мазохизм.

Мне ebuild показался намного более нормальным вариантом, чем многие прочие. Чем guix лучше, кроме лиспа?

Парни из guix уверены, что всё должно раскручиваться из минимального блоба (в идеале в пределах 1KB)

Что в данном случае подразумевается под блобом? Какая логика подобных ограничений?

В общем, оно довольно сырое, но юзабельное

Разработчики принимают патчи, улучшения в базовые утилиты или окуклились в своем мире? Насколько активно вообще происходит обсуждение новых фич (мейл листы или issues, что они там используют в основном) и есть ли какой-то roadmap? Куда идем, к чему стремимся - не только в плане философии, но и технических вещей.

есть работа, семья и нормальные хобби, то лучше проходить мимо.

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

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

Мне ebuild показался намного более нормальным вариантом, чем многие прочие. Чем guix лучше, кроме лиспа?

Честно говоря, это, скорее, моё субъективное ощущение - ебилды писал давно, и тогда это вызывало у меня сложности, возможно, просто был тупее, чем сейчас. Из того, что можно отметить - наличие разных билд-систем для сборки автотуловых пакетов, cmake-овых, емаксовых, растовых итд, что делает рецепты очень короткими; возможность втыкаться в разные фазы билд-систем; возможность наследоваться от существующих пакетов (например, наложить патч на существующий пакет можно буквально в три строки). Но в сравнении с дебами и рпмами гикс явно выигрывает.

Что в данном случае подразумевается под блобом? Какая логика подобных ограничений?

Фундаментальная мысль, на которой это всё строится - речь Кена Томпсона под названием Reflection on Trusting Trust. Клчючевой вопрос - можем ли мы быть уверены в софте, в исходниках которого мы уверены, но который был собран непроверенным компилятором? А если компилятор мы проверили, но сам он собран непроверенным компилятором? Можно оттранслировать этот вопрос на свободное ПО: нарушаются ли свободы пользователя, если софт под свободной лицензией был собран несвободным компилятором. Но ведь начать с чего-то нужно, и этому чему-то мы вынуждены доверять. В общем, конечная цель - максимальное уменьшение trusted computing base. Отсюда неформальное требование - не тащить из интернетов блобы, в происхождении которых нет уверенности и которым приходится доверять. Скажем, почти вся система собирается из т.н. trusted binary seed размером 120MB, и ведутся работы по уменьшению его размера. Например, rust раскручивается из сишной реализации компилятора, способной собрать одну из старых версий официального компилятора. А вот ghc поднимается из блоба, скачиваемого с официального сайта.

Разработчики принимают патчи, улучшения в базовые утилиты или окуклились в своем мире? Насколько активно вообще происходит обсуждение новых фич (мейл листы или issues, что они там используют в основном) и есть ли какой-то roadmap? Куда идем, к чему стремимся - не только в плане философии, но и технических вещей.

Основная тусовка на freenode, в мейллистах разработка. Также в телеге есть группа GNU, в которой сидят мейнтейнеры guix, и есть официальная группа guix, в которой, к сожалению, довольно тихо, но в которую можно завалиться - https://t.me/gnuguix . Патчи прилетают постоянно, реагируют на них весьма активно, причём не только в мейллисте, но и в чате - лично наблюдал, как один из разрабов помогал нубу с патчем. По словам одного из членов, в nixos его патч висел несколько недель, в итоге его молча завернули, здесь сразу пояснили, что не так, и в течение трёх дней довели до коммита.

Касательно роадмапа точно не могу сказать. Понятно, что у ключевых разработчиков есть свой план, и они ему следуют. По блогу и выступлениям на том же фосдеме можно примерно понять, куда они направляются. Но при этом появляются группы, которые преследуют свои цели. Вот недавно несколько человек в irc собрались и решили продвигать data science. Хотят затащить в пакеты всякий ml, coq, isabelle/hol и прочий матан, о чём и сообщили в мейллист. В общем-то, никто не против, все за, обещали всячески содействовать.

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

На текущий момент на настройку и допил времени уходит больше, чем с какой-нибудь убунтой. Супруга злится и требует вернуть всё взад, приходится отбиваться. Но, думаю, это вопрос времени, и в конечном счёте guix всех побьёт. А если ещё и на микроядро переедет, вот это будет да… :D

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

Не трынди убунту онли если конечно ты не 60 летний ИТ старикан. Как говориться хочешь отсутствия драйверов то ставь , а кому то надо уже готовое решение что бы оно работало.

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

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

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

Спасибо за комментарий, интересный перспективный проект. Жаль, в guile не такие макросы забористые, как в racket. Ну ниче, и так неплохо :)

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

Чтобы иметь стабильную настраиваемую систему без боязни обновиться, что все развалится нах?

Fedora Silverblue

anonymous
()
4 августа 2020 г.
Ответ на: комментарий от anonymous

Что, если это «дерево» в метапрог загнать? Можно же мышкой программировать! А? А? А?

man структурный редактор

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

Теперь вопрос: нужен ли такой язык, который без ide страшен как черт, для написания конфигураций (несложных)?

нужен, ибо это язык-конструктор.

вот например, ассемблер, си, условный бейсик/питон/луа. образуют логическую триаду – асм обычный, асм переносимый (мобильный) со стандартной библиотекой минималистичной с 0 рантаймом с 0 накладными расходами, далее либо цепепе с не0 рантаймом за счёт компайлтайма, либо прикладнуха-скриптуха – бейсикопитонолуа как человекочитаемый алгол с более богатым рантаймом с батарейками.

здесь перескочить с языка на язык нужно думать. и отличия понимать. синтаксисы разные, опять же. что запутывает. наверное, из-за синтаксисов даже в обратную сторону из lua/LOVE через Terra в компилируемое и далее в асм будет проще освоиться.

кстати, та же луа. императивное нечто с метатаблицами «для написания конфигураций несложных». но почему-то алголистое.

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

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

при этом есть базовый моноид в каждом (мета)языке разный, за счёт которого образуется эта составимость, композабельность (мета)выражений: стек, списочно-скобочная структура (точечная пара), термы-утверждения и предикаты-правила вывода.

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

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

кстати, «ide написать» на проективном структурном редакторе в духе какого-нибудь MPS, Stratego/XT, Xtend/Xtext – не так уж и сложно. если видны и понятны преобразования всех этих структурных выражений в этот базовый моноид, обеспечивающий lifting arrow.

нужен, ибо это язык-конструктор. и когда язык проще – конструктор тоже упрощается.

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

Эта «новинка» бесплатна?

в рантайме может быть бесплатна после того как отработает CTFE. то есть, на выходе имеем сишный идеал – зерокост с 0 рантаймом.

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

А функции с точкой - это методы ооп окружения. Но ооп здесь не причем

всё верно – это ещё один базовый моноид (другой). функционально-объектный. эти «методы» возвращают «объектное замыкание» в котором моноид. «.» это плюс моноида, условный нулевой объект базовый корень Object это ноль моноида.

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

брейнфак гомоиконный

С однострочниками на перле форте,

fixed for the great justice

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