LINUX.ORG.RU

Вопрос про историю лиспа

 , ,


2

2

Мне понравилось замечание в SICP что у лиспа довольно специфичный взгляд на синтаксический сахар. Но вот я не могу понять почему в таких формах из CL как cl:defun или cl:destructuring-bind у ключевых симоволов &key, &optional приставка & вместо использования более адекватных для CL кейвордов?

★★★★★

Последнее исправление: ados (всего исправлений: 1)

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

А там тупой ассерт во времени выполнения, как в лиспе. Что говорит о глубоком непонимании того, зачем нужны типы.
Если ввести lisp static typing в гугл, то единственное что найдёшь — Carp. Всё! Остальные лиспы в типы не умеют.

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

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

turtle_bazon ★★★★★
()
Ответ на: комментарий от quantum-troll

Можешь ещё Qi посмотреть, раз гугл не умеет. :) Точнее, его потомка ShenLanguage

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

SBCL по умолчаню тоже статически чекает, но отдаёт варнинги вместо ошибки.

В документации, однако, об этом ни слова.

quantum-troll ★★★★★
()
Ответ на: комментарий от quantum-troll
CL-USER> (lambda (x)
           (declare (type integer x))
           (write-string x))
; in: LAMBDA (X)
;     (WRITE-STRING X)
; 
; caught WARNING:
;   Derived type of X is
;     (VALUES INTEGER &OPTIONAL),
;   conflicting with its asserted type
;     STRING.
;   See also:
;     The SBCL Manual, Node "Handling of Types"
; 
; compilation unit finished
;   caught 1 WARNING condition
#<FUNCTION (LAMBDA (X)) {1001A1C74B}>
CL-USER> 
ados ★★★★★
() автор топика
Ответ на: комментарий от slovazap

Тебе уже ничто не поможет, а для остальных: Как написать музыку, используя ООП (сегоднящний хабр)

Из документации (гуглоперевод):

OM (OpenMusic - прим. мое) - это визуальный язык программирования, основанный на Common Lisp . Визуальные программы создаются путем сборки и соединения значков, представляющих функции Lisp и структуры данных, встроенные управляющие структуры (например, циклы) и другие программные конструкции. OM может использоваться в качестве языка визуального программирования общего назначения и повторно использовать любой существующий код Common Lisp. На более специализированном уровне, набор встроенных инструментов и внешних библиотек делают его мощной средой для создания музыки. Предусмотрены различные классы, реализующие музыкальные структуры, связанные с графическими редакторами, включая обычные нотации музыки, MIDI, OSC, 2D / 3D-кривые и аудиобуферы.

Последний коммит 2 дня назад.

anonymous
()
Ответ на: Третий от Camel

Plankalkül был лишь на бумаге. Так что не считается.

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

Да. Поэтому и слез с неё. Полезу обратно.
Потому что работы в Союзе, оказывается, хватает с головой.

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

Работы хватает, да. Но после кложы на CL пишу - вообще волосы сдувает скоростью. А так язык неплох. И среды для неё. Ещё ClojureScript очень неплох.

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

После кложи тоже на CL ушёл, прикипел на некоторое время к нему основательно, настолько он хорош. Это всё mv виноват аки сладкоголосая сирена. Потом на Racket, спасибо monk. Как кложей заинтересовался точно не помню, вроде где-то прочитал статью авторства ott, и пошло-поехало, это же дело заставило наконец-то перейти с vim на emacs.
А так, инструменты по работе сейчас это старая перловка и старый 3-й баш.

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

Я сам емаксом тоже пользуюсь. Есть пара проектов на clojure, пара проектов на scheme. А в основном сейчас делаю на CL. Ибо хорошо, удобно, может в низкий уровень.

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

Кстати, раз уж тут собрались лисперы. Как в лиспах нынче принято делать локализацию? А то посмотрел на srfi-29, так на всём github'е его никто не использует. И как принято использовать, неясно.

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

А так ли это важно, когда не «hello world»- работают достаточно быстро (reitit - https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=j... а в задачах - гдё бьются за каждую наносекунду кложу и не используют (хотя и там есть https://neanderthal.uncomplicate.org и т.п)

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

Как в лиспах нынче принято делать локализацию?

Никак. :) Я не делаю. Кто делает, наверное, биндинги к сишной либе юзают. Во всяком случае, я бы так сделал. Или бы быстро свой колхоз накидал.

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

А так ли это важно, когда не «hello world»- работают достаточно быстро

Ну сравнительно же. Субъективно CL приятнее. Тем более, SBCL много статических проверок делает, что ещё приятнее. В кложе с этим в разы хуже.

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

Какой ты внушаемый. Советую переходить на Smalltalk - крутейший язык, за ним будущее!

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

Субъективно CL приятнее.

А monk говорит там много дыр, посоветовал мне DrRacket. GUI на нём рисуются на ура. А как его понять насчёт дыр в CL, не могу.

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

Вторая большая - отсутствие продолжений. Это обусловлено архитектурой и мееееедлиииитеееельносью продолжений.

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

что лечится.

Вот про это я и возмущался. Правильной версией считается

(defmacro do-primes ((var start end) &body body)
  (let ((ending-value-name (gensym)))
    `(do ((,var (next-prime ,start) (next-prime (1+ ,var)))
          (,ending-value-name ,end))
         ((> ,var ,ending-value-name))
       ,@body)))

А то, что он ломается на коде типа

(flet ((next-prime () здесь моя функция))
  (do-primes (n 1 100) (format t (next-prime n))))
это так должно быть.

В Racket мне не приходится заучивать все символы используемых модулей. Если я определю какой-то свой с тем же именем, то мне просто будет недоступен соответствующий символ из импортированного модуля. Но если я его не использую, то мне он и не нужен. А в CL даже в классе метод с именем map определить нельзя :-(

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

Его основные претензии к отсутствию в ЦЛ гигиены

Основная претензия — щедро рассыпанные грабли как в Си. Активное использование деструктивных операций над списками и при этом общих хвостов списков. Возможность сделать деструктивную операцию над литералом!

Неповторяемая сборка, которая даёт разное окружение выполнения в REPL и при сборке у клиента (из-за разной трактовки eval-when). defconstant, который, с одной стороны позволяет менять константную строку, а с другой, запрещает загрузить один и тот же модуль дважды.

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

Раз уж тут про лиспы, тоже спрошу.

Есть простой язык, и нужно для него минимальными усилиями сделать прототип реализации. Желательно с REPL и интроспекцией всех внутренностей. Верно ли что простейшим вариантом будет оформить его как eDSL на лиспе? Куда смотреть, на переопределение ридера?

Лиспов не знаю, столкнулся с таким вопросом впервые.

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

Верно ли что простейшим вариантом будет оформить его как eDSL на лиспе?

Если семантика совпадает с Common Lisp, то eDSL. Через set-macro-character. Как в https://github.com/sshirokov/CLSQL/blob/master/sql/syntax.lisp

Если произвольный, то на Racket: https://docs.racket-lang.org/guide/languages.html

Вот примеры пошагового написания языков от Brainfuck до Basic: https://beautifulracket.com/

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

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

Вы про раст?

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

Вот про это я и возмущался. Правильной версией считается...
...В Racket мне не приходится заучивать все символы используемых модулей.

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

А в CL даже в классе метод с именем map определить нельзя :-(

Можно.

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

Основная претензия — щедро рассыпанные грабли как в Си.

Общелисп написан инженерами для инженеров! Это не учебный и не академический язык, как схема и последователи. Отсюда соответствующие требования к программистам на ЦЛ. Взамен - соответствующие возможности.

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

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

Если пишешь :use, то сломаться может в следующей версии модуля (добавили новую функцию и использовали её в макросе). А загенсимленные функции в CL использовать надо бы, но не принято.

Можно.

Сделав shadow на библиотечный? И заставив всех пользователей этого класса делать такой же shadow или обращаться к методу через имя пакета?

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

Инженерия с граблями прилагается?

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

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

Интересно, COBOL, Ada, Java и C# — это учебные или академические языки? Или без постоянного превозмогания настоящим инженерам неинтересно? Если машина, так должен быть УАЗ, если язык, то Си или общелисп.

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

Интересно, COBOL, Ada, Java и C# — это учебные или академические языки? Или без постоянного превозмогания настоящим инженерам неинтересно?

google:«java integer cache»

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

google:«java integer cache»

И кому оно мешает? Вроде полезная оптимизация.

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

google:«java integer cache»

В лиспах такое тоже есть, только на усмотрение реализации. Поэтому есть eq и eql или eq? и eqv?

Racket: 

> (eq? (* 6 7) 42)
#t

> (eq? (expt 2 100) (expt 2 100))
#f
SBCL:
* (eq (* 6 7) 42)
T
* (eq (expt 2 100) (expt 2 100))
NIL
monk ★★★★★
()
Ответ на: комментарий от monk

Если машина, так должен быть УАЗ, если язык, то Си или общелисп.

Хорошо подмеченно!

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

Я же тебе написал: для инженеров. Инженер обладает знаниями, позволяющими избегать ошибок в обычных ситуациях, а в экстраординарных случаях не только прочитать документацию, но и разобраться в коде. Если же ты рассчитываешь на условного «пехапешника с опытом до года», то предусматривай это в своих макросах! А лучше не используй лисп.

У меня в институте один одногруппник любил придумывать «расклады» как на «мизере» с двумя длинными младшими мастями получить восемь взяток. В жизни на подобный расклад мог попасться только полный новичок)

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

Именно так. Кстати, про советский автопром тоже самое говорили.

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

Интересно, COBOL, Ada, Java и C# — это учебные или академические языки?

Это ты к чему? Бредишь? Или утверждаешь, что «COBOL, Ada, Java и C#» - наследники схемы?

Если машина, так должен быть УАЗ, если язык, то Си или общелисп.

У «крестьян» живущих в Южной и Центральной Америке денег хватит на покупку и Хаммеров, и Гелендвагенов. Почему же они предпочитают УАЗики?

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