LINUX.ORG.RU

Vim или Emacs? А LISP в 2021?

 , ,


1

4

https://www.youtube.com/watch?v=8Q9YjXgK38I&t=42s

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

А ведь Crashbandicoot была годной игрой…

Что выбрать? Vim или Emacs?
Изучать в 2021 году Lisp? Если изучать, какой? Практика?
А не засмеют сотрудики?

Времени в сутках маловато, на всё не хватает.


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

А представляете что будет через неделю? А через месяц?

Это-то я понял. Я не понимаю, почемы ты уперто не закрываешь то, что в данный момент тебе не нужно?

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

А вы не пробовали свой канал на ютубе завести? Говорят, жанр «блоггер бесится при обзоре чего-нибудь» очень популярен.

На ютубе и так тупости через край, еще его не хватало.

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

И вот куда хачкель засунуть?

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

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

Так есть же всякий recoll

Да, я когда-то чем-то подобным пользовался — не уверен, что это было именно оно, но потом я просто забил, потому что не почувствовал какого-то роста удобства. Как правило, инструменты на базе Lucene/Xapian предназначены для перелопачивания гигабайтов мусора, а не единиц мегабайт плотной семантики, потому они не умеют в «найди мне в этой тематике и связанной с ними» — а это ключевая фича Zettelkasten. Заметь, в Zettelkasten нет никаких «алфавитных индексов слов», которые как бы нам предлагают полнотекстовые поисковики, вместо этого весь смысл организации по Zettelkasten подразумевает именно поиск по семантическим секциями и связанными сущностям.

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

А я вот на пианино играю, но заработать на этом в ближайшее время не получится

А надо? Зато ты развиваешь моторику рук, память, слух. Наверняка это тебе пригодится в работе если не прямо, то косвенно. В конце концов улучшит настроение и работоспособность.

Как я и не строю иллюзий по поводу того, что лисп — удобный ЯП

Ты просто его не осилил.

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

Я не понимаю, почемы ты уперто не закрываешь то, что в данный момент тебе не нужно?

Знал бы прикуп — жил бы в Сочи. Закрыл «ненужный» файл — через полминуты его уже открыли снова. Знаем, проходили.

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

Как я и не строю иллюзий по поводу того, что лисп — удобный ЯП

Ты просто его не осилил

Ну как тебе сказать... я даже особо и не пытался. Я познакомился с кложей, и я сразу заценил идею персистентных структур данных. При этом я не увидел вообще никакого толка в макросах. Ломать язык только для того, чтобы адаптировать его под бесполезные макросы — такая себе затея. Учитывая то, что индустрия думает точно так же — я не вижу никакого смысл вкатываться в эзотерику.

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

Ну как тебе сказать… я даже особо и не пытался.

Тогда о чём спор вообще? Ты некомпетентен ¯\_(ツ)_/¯

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

Разве онные не пытались максимально мимикрировать под всякие IBM/360?

Разве IBM изобрела ЭВМ? Разве не было работы для мейнфреймов в первой половине 1960-х?

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

Я для именно таких

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

запилил ссылку на песню. Могу повторить: https://www.youtube.com/watch?v=HM1Zb3xmvMc

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

Одни только библиотеки для сложных вычислений. На чем их писать как не на хаскеле и иже с ним?

справедливости ради, когда ты начинаешь на хаскеле бороться за скорость вычислений, код становится про пц какой непонятный ))

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

Закрыл «ненужный» файл — через полминуты его уже открыли снова. Знаем, проходили.

не очень понятно чем поиск по 400+ табам отличается от поиска файла по директориям.

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

Я не понимаю, почемы ты уперто не закрываешь то, что в данный момент тебе не нужно?

А зачем буфера туда-сюда закрывать? В чём смысл этой операции? Тупо лишнее действие, которое можно не делать.

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

Ну что это такое? Там всего на три строчки функция, и уже… Или мне приводить пример посложнее?

«Богатая семантика» для тех, у кого аллергия на круглые скобки.

По статистике, порядка 10-30% функций в средней по больнице программе полиморфичны

Это в диалектах CLOS, потому что переделать простую функцию в обобщённую там сложно. В Haskell и Си++ любая полиморфичная функция имеет как минимум две реализации.

Попытался найти в SBCL реализацию макроса «loop» — а ево нету.

https://github.com/sbcl/sbcl/blob/master/src/code/loop.lisp

Правда, это же нерасширяемо и приколочено гвоздями, ведь на макросах такого повторить нельзя — это разве настоящий лисп?

Вот расширяемая версия: https://common-lisp.net/project/iterate/

я сейчас поднял доки по схеме, кложе — а там нет таких циклов

На Racket есть стандартные

(for/list ([i (in-inclusive-range 1 11)]
           [j (in-naturals 100)])
  (list i j))

и есть https://planet.racket-lang.org/display.ss?package=loop.plt&owner=jphelps

Разве функции не являются такими же аргументами?

Нет в макросе можно написать

(lsp-with-current-buffer buffer
  (spinner-start spinner-type))

и сначала будет выбран текущий буфер, а потом в нём будет запущен (spinner-start spinner-type). А если бы это была функция, то сначала бы запустилась (spinner-start spinner-type), а потом её результат попал бы к функции lsp-with-current-buffer.

Как в том же хаскеле.

В хаскеле функции частично заменяют макросы за счёт ленивости. Ещё можно как в Scheme или JS действия в лямбды заворачивать:

(lsp-with-current-buffer buffer
  (lambda () (spinner-start spinner-type)))

В elisp могут быть проблемы, если spinner-type локальная переменная. В Common Lisp проблем нет, но видимо были когда-то давно, поэтому передавать замыкания в параметрах не принято.

Питон спокойно справляется без макросов в таких же сценариях. И даже JS справляется.

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

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

не очень понятно чем поиск по 400+ табам отличается от поиска файла по директориям.

В открытых файлах место прокрутки и курсора сохраняется.

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

Пока пользовался Vim. Это примерно год.

Добавлю. Сейчас я пользуюсь Emacs сочетаниями, но Ctrl перенесён на Alt.

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

Чо-о? «((sometype*)&p->abc[idx].fld)->val». Удачи переписывать на хаскеле в одну строку.

pval . fld $ (pabc $ to_sometype p) ! idx
monk ★★★★★
()
Ответ на: комментарий от byko3y

Так проблема в том, что это не IDE на хаскеле — это IDE на JavaScript со скриптами на хаскеле.

На чистом хаскеле GUI не завезли. Либо Си (GTK, wx), либо JS. Собственно, поэтому у меня основной язык Racket.

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

Разве IBM изобрела ЭВМ? Разве не было работы для мейнфреймов в первой половине 1960-х?

Рыночек же ж. Sum Microsystem вложило миллиарды в раскрутку бесеполезной — и обанкротилась. IBM потратило на разработку IBM/360 больше, чем было потрачего на Манхеттенский проект по разработке ядерной бомбы, но если бомба жахнула нормальна, то из IBM/360 получился пшик, но даже этого пшика хватило, чтобы направить инерцию рынка, по крайней мере мейнфреймов. Таких примеров немало, возьми еще, например, AT&T или Xerox — эти фирмы определили индустрию ПО, а кто об этом помнит?

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

AT&T или Xerox — эти фирмы определили индустрию ПО, а кто об этом помнит?

Кто надо - помнит. И на патенты смотрит.

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

Я для именно таких запилил ссылку на песню. Могу повторить: https://www.youtube.com/watch?v=HM1Zb3xmvMc

Весомый аргумент, но нет — макросы выполняют ту же роль, что и функции, а потому макросы не нужны. Меня, на самом деле, удивил тот факт, что даже сам Common Lisp отказался от s-выражений и ввел в язык конструкции, которые нельзя реализовать макросами. Видимо, кто-то из стандартизаторов уже понимал, что s-выражения не взлетят.

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

не очень понятно чем поиск по 400+ табам отличается от поиска файла по директориям

Ничем. Я уже писал, что в 2021 году нет никакой разницы между вкладками и файлами — просто, создатели ПО ленятся и не могут наладить вечное постоянное хранилище для состояний вкладок. Это состояние ведь даже не обязательно хранить в оперативной памяти — разных локалхостных СУБД с гибким буферированием наклепали мало, что ли?

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

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

Нельзя констрeкции типа loop или Racket’овского for/list реализовать функцией как ни пытайся.

Меня, на самом деле, удивил тот факт, что даже сам Common Lisp отказался от s-выражений и ввел в язык конструкции, которые нельзя реализовать макросами.

Эти конструкции тоже реализуются макросами, только другими. Макросами чтения (read macro).

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

Макросы чтения используются не для замены s-выражений, а для дополнительных конструкций. Либо #Xданные (где X - какой-то символ), либо доопределение фигурных или квадратных скобок с DSL внутри.

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

«Богатая семантика» для тех, у кого аллергия на круглые скобки

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

Правда, это же нерасширяемо и приколочено гвоздями, ведь на макросах такого повторить нельзя — это разве настоящий лисп?

Вот расширяемая версия: https://common-lisp.net/project/iterate/

Да, вот это скобкота, которую я узнаю.

и сначала будет выбран текущий буфер, а потом в нём будет запущен (spinner-start spinner-type). А если бы это была функция, то сначала бы запустилась (spinner-start spinner-type), а потом её результат попал бы к функции lsp-with-current-buffer

Это и есть тот самый «новый синтаксис», который эти макросы приносят? Просто чтобы сделать ленивое вычисление аргументов?

В хаскеле функции частично заменяют макросы за счёт ленивости

Ты развернул причинно-следственную связь: это в лиспе макросы заменяют функции за счет отсутствия ленивости. В F# ленивость есть и макросов нету — как так?

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

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

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

pval . fld $ (pabc $ to_sometype p) ! idx

Восклицательный знак? Наверное, имелось в виду "!!"? Ты ошибся с порядком операций, но это не важно — будем считать, что я задумывал:

((sometype*)&p)->pabc[idx].fld->val

Но не все так просто. Напоминаю, что ты работает с unboxed типами данных по месту — ты не можешь работать с ними как с обычными структурами хаскеля. Ты должен получить контейнер на элемент массива pabc[idx], через что-то вроде такого:
https://downloads.haskell.org/~ghc/7.10.1/docs/html/libraries/Foreign-Marshal...
и потом этот контейнер ты уже ПО МЕСТУ разыменовываешь как структуру.

К тому же, что такое to_sometype?

Ну и вариант «тупо превратить сишный структуры в родные хаскевы» не прокатывает, потому тчо условие было «переписать строчка в строчку».

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

На чистом хаскеле GUI не завезли. Либо Си (GTK, wx), либо JS. Собственно, поэтому у меня основной язык Racket

Вот и я о том же — на хаскеле нельзя написать GUI.

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

макросы выполняют ту же роль, что и функции, а потому макросы не нужны

Мне вот сегодня понадобилась функция, которая возвращает список ((имя-аргумента значение-аргумента) ...) (потом этот список передается в функцию, которая в текстовом шаблоне заменяет имя-аргумента на значение-аргумента). Как это сделать без макросов?

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

Эти конструкции тоже реализуются макросами, только другими. Макросами чтения (read macro)

«Read macro» у меня сейчас в моей питоньей либе. Как же так, говорили ведь, что только лисп умеет в DSL? И где теперь ваш Б-г? А тем временем питон поддерживает кастомные загрузчики, имеет в стандартной либе парсер AST, у которого можно дерево крутить-вертеть как хочешь перед загрузкой. Да еще и отладчик после этого по строкам правильно ходит.

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

планирую перепрофилироваться под PHP разработку

Не вздумай. Это же зашквар. Будут относиться чуть лучше, чем к 1С-никам.

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

VScode быстрый

Наркоман? Принимаешь какие-то вещества?

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

Не вздумай. Это же зашквар. Будут относиться чуть лучше, чем к 1С-никам

А типа быть питонистом — это не зашквар?

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

А типа быть питонистом — это не зашквар?

Уж лучше, чем php.

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

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

def foo(a, b, c):
	params = locals()
	return [(key, params[key]) for key in foo.__code__.co_varnames]

>>> foo(1, 2, 3)
[('a', 1), ('b', 2), ('c', 3)]
byko3y ★★★★
()
Ответ на: комментарий от byko3y

Ты опять не то написал. Вот на схеме:

(define-syntax foo
  (syntax-rules ()
    [(_ a) `((a ,a))]
    [(_ a b ...) (cons `(a ,a) (foo b ...))]))

(наверное можно красивей, чтоб сразу список создавался, но и так работает. @monk?)

Вызываем (foo a b something), получаем ((a 1) (b 2) (something 100500))

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

Ну что это такое, а? Как мне тепрь стереть блевотинушку с клавиатуры?

RTTI, епта. Я как бы не виноват в том, что челу нужна информация про имена аргументов в рантайме.

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

Вызываем (foo a b something), получаем ((a 1) (b 2) (something 100500))

Это вообще полная херотень — зачем так делать? А если я захочу (foo (+ a 1) b something), то что оно мне выдаст?

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

Благодарю. Мне уже всё интереснее, куда меня выведет приобщение.

Как глубока кроличья нора?

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

Это не хренотень, а нужный макрос, который ты не сможешь реализовать функцией, и потому скажешь, что это ненужная хренотень.

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

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

Не так-то просто было портировать уже имеющиеся программы для 36-разрядных машин на недо32-разрядные IBM/360, да и незачем. Для того же лиспа System/360 менее удобна, чем архитектуры 36-разрядных ЭВМ.

В итоге 36-разрядные системы счастливо дождались заслуженного отдыха на аппаратно-программных 64-разрядных эмуляторах.

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

Это не хренотень, а нужный макрос, который ты не сможешь реализовать функцией, и потому скажешь, что это ненужная хренотень

Последний раз функции знали имена фактических аргументов где-то в 70-х годах. С тех пор от этого отказались и больше никогда не применяли. Почему — я ответил. А ты, кстати, так и не сказал, что будет, если сделать (foo (+ a 1) b something) — а в этом и вся причина, почему уже 50 лет так не делают.

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