LINUX.ORG.RU

Не учите Common Lisp!

 ,


1

7

Хочу предостеречь форумчан от изучения Common Lisp. Возьмите самую лучшую имплементацию — SBCL и скомпилируйте следуюущие лямбды:

;; Взятие элемента по индексу x из массива x
(lambda (x) (aref x x))
;; Взятие элемента по индексу y из массива x и прибавление к x
(lambda (x y) (+ x (aref x y)))
;; Один из путей выполнения: прибавление X к NIL
(lambda (x y) (+ x (funcall (lambda (x) (if x 0 x)) y)))

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

Минус коммон лиспа как языка — слишком разрешательский стандарт. Почти сплошь и рядом там фразы вроде «Эффект, производимый объявлением inline, определяется реализацией» или «Реализация вольна игнорировать то-то и вместо этого делать то-то». Из-за этого разработчики того же SBCL будут игнорировать твои баг репорты, где из-за неправильного поведения компилятора (с точки других опубликованных алгоритмов) твой код будет работать раза в 2 или 3 медленнее, чем должен бы.

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

Короче, учите языки с хорошей теоретической базой и статической типизацией. Байкам @lovesan не верьте ни одной.



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

А ещё четыре звезды…

Тогда объясните первую функцию:

;; Взятие элемента по индексу x из массива x
(lambda (x) (aref x x))
  • Чему равен массив x
  • Почему индекс x находится в пределах индексов массива x
  • Почему массив и индекс имеют одинаковое обозначение, это позиционные элементы, и названия не важны?
dmitry237 ★★★★
()
Ответ на: комментарий от anonymous

Ну nyxt — это всё же не мой браузер :) Я туда только контрибучу иногда

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

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

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

В данном контексте, это вызов функции AREF с 2 аргументами

https://gigamonkeys.com/book/syntax-and-semantics

Function Calls

The evaluation rule for function call forms is simple: evaluate the remaining elements of the list as Lisp forms and pass the resulting values to the named function. This rule obviously places some additional syntactic constraints on a function call form: all the elements of the list after the first must themselves be well-formed Lisp forms. In other words, the basic syntax of a function call form is as follows, where each of the arguments is itself a Lisp form:

(function-name argument*)
Thus, the following expression is evaluated by first evaluating 1, then evaluating 2, and then passing the resulting values to the + function, which returns 3:

(+ 1 2)
dura4ok11
() автор топика
Ответ на: комментарий от vbr

И эти люди потом ругают монады, когда их же и описывают, но своим языком

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

The evaluation rule for function call forms is simple

это правило ВЫЧИСЛЕНИЯ вызова функции или лямбды. а описание функции или лямбды - это не вычисление. вычисление будет тогда, когда ее вызовут в виде (fun arg0… argN). то есть пока ты ее не вызвал(ну или не попытался вычислить еще как-то), можешь ее описать как любую фигню.

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

я комонлиспа не знаю сразу говорю. я знаю как работает лисп машина.

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

С вами наша еженедельная рубрика «Советы от Соника»: если минимально выучить лисп (ну, хоть PCL прочитать), получается лучше и эффективнее участвовать в лиспосрачах.

P.S. Не спрашивайте откуда я это знаю.

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

Эти лямбды ВЫЧИСЛЕНЫ до лямбд.

CL-USER> (lambda (x) (aref x x))
#<FUNCTION (LAMBDA (X)) {1000C985FB}>

Всё в лиспе вычисляется до нормальной формы, если не цитировано

CL-USER> '(lambda (x) (aref x x))
(LAMBDA (X) (AREF X X))

И это не специфика коммон лиспа, это черта всех лиспов.

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

Поумнели, может быть?

А тем, кто хотел бы, не хватает знаний о Лиспе, чтобы срач получился по существу. Слышали только где-то, что «все есть список». Правда-не правда – какая разница.

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

Ну да, а ещё LOL. Это раньше для срача надо было в теме разбираться, сейчас-то зачем?

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

Да что он натянет, он нормальных аргументов привести не может для поддержания срача. Что говорить, времена vsl давно прошли.

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

не слежу за js. Там уже появилась CLOS или перезапуски?

Ну поддержка ООП там есть, для тех редких случаев, когда ООП реально нужен — её достаточно. А если хочется обобщённых функций без всего остального хлама типа наследования — реализация мультиметодов на TS занимает 150 строк кода. Вместе с типами и подробными комментариями.

перезапуски

Читал про них — думал, вау, как круто. Но реального применения так ни одного и не придумал %)

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

Читал про них — думал, вау, как круто. Но реального применения так ни одного и не придумал %)

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

dura4ok11
() автор топика

Говорят, типизированное лямбда-исчиление появилось только в ML языках.

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

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

О, у Александра Лаэртского про это песня есть.

Nervous ★★★★★
()

может я что-то пропустил, но откуда впрямую индексируемые массивы в потугах-на-фп ? но это так, к слову пришлось

на

(lambda (x) (aref x x))

и дальнейшее

даже будучи далёким от лисп, понимаю что компилятор ругаться не должен. ВСЁ ПРАВИЛЬНО.

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

а лисп это не ФП. массивы там есть. они в Scheme вроде есть. их постоянно втыкивают исключительно ради эффективности.

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

Статически типизированный лисп - это не лисп, это уже другой язык, где синтаксис основан на s-expresion.

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

#<FUNCTION (LAMBDA (X)) {1000C985FB}>

это означает (если наморщить затылок) что интерпретатор словил функциональный обьект, представленный списком (LAMBDA (X))

(LAMBDA (X) (AREF X X))

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

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

alysnix ★★★
()

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

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

Как там было у Желязны в «Князе Света» - но молились облаченные в шафранные рясы, и я спустился к ним

Если честно то заебался объяснять людям примитивные вещи

lovesan ★★★
()

Ну вот, пришел Лавсан и все опошлил, назвав вещи своими именами. А человек ведь так старался, выдумывал хрень, написать которую никому в трезвом уме в голову не придет.

anonymous
()

ты что-то странное говоришь.

Всем плевать на стандарт, все ориентируются на одну реализацию, к которой привязаны эмоционально.

max_lapshin ★★★★★
()

Короче, учите языки с хорошей теоретической базой и статической типизацией.

Короче, учите Haskell.

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

Если честно то заебался объяснять людям примитивные вещи

ну а как еще стать из обезьяны человеком?

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

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

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

Судьба Меченосца, Манжушри - трагична, и полна страданий

lovesan ★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.