Comments 71
Заточил под пошаговое выполнение и создал свою IDE, простую но работающую.
Почему Вы не рассказали про неё?
Так и девтул под хром есть https://github.com/binaryage/cljs-devtools
Не хотите попробовать реализовать его в формате tree вместо s-expressions и компилировать в wasm, а не интерпретировать? Тут я рассказывал про эту идею.
Почитал статью по ссылке. Любопытненько.
От скобочек действительно было бы выгодно отказаться. Правда это уже был бы не Лисп, я думаю))
setq i 0 id null
while
< i sentence1.length
setq prev_id id
setq id
Storage.set
+ "string"
Brain.new_id
:type
"word"
:value
sentence1.@i
:prev_id
prev_id
if
!= prev_id null
Storage.set
prev_id
:next id
++ i
Не уверен, что читабельность увеличилась...
Не очень понял, что делает ваш код. Но как понял переписал в более понятной форме:
let index 0
let id null
loop
switch
test ordered?
index
sentence1 .length
then break
let prev_id id
put id Storage .set
join
\string
Brain .new_id
object
type \word
value sentence1 @ index
prev_id prev_id
switch
test unique?
prev_id
null
then Storage .set
prev_id
object
next id
++ index
Правда это уже был бы не Лисп
Это уже( (всё ещё?)) не лисп. Мне кажется, вы слишком буквально поняли акроним как Lots of Irritating Superfluous Parentheses)))
Если говорить о языках общего назначения, то да.
Но не надо забывать такие встраиваемые языки, как EmacsLisp, которых дофига и больше.
… И получился недо-Fort, недо-Tcl на питонозакваске...
youtu.be/R4sTvHXkToQ
youtu.be/l4mmMsAVjzk
;; лямбды и функции тоже естьа оптимизация хвостовой рекурсии есть?
В Erlang нету циклов. Там надо использовать хвостовую рекурсию для организации цикличности. Но там green threads и это как раз выгодно для их функционирования.
То, что вы написали, это джаваскрипт со скобочками)))) Но никак не лисп, уж извините.
Макросы то есть? Вот если без них, то это очень урезанный извращённый лисп тогда… автор исправляй пожалуйста «это».
У меня Stack overflow не может произойти. Т.к. нету стека вызовов. Используется цепочка контекстов и бесконечный цикл. Т.е. будет работать столько, сколько есть оперативной памяти (миллиард вызовов или более...).
Я добавил в beta3 TCO.
Пожалуйста не ссортись:)
Если есть конструктивные предложения, то скажите. Я постараюсь реализовать их по мере возможности.
(x + 1 2 3)
Подскажите, не возникает ли у вас ощущение диссонанса из-за такой формы записи? Я понимаю, что это выглядит хорошо в случае с (x + y), но когда (x + y z) — лично у меня вызывает недоумение, хотя я, конечно, могу понять о чем идет речь. Не стоит ли в таком случае дополнить до (x + y + z + a + b)? Тем более, что, на сколько мне известно, в common lisp уже есть реализация такой возможности
Но честно говоря форма (+ x y z) меня коробит побольше. Lisp для меня пока-что новый язык.
Возможно я добавлю такой синтаксис тоже в парсер. Хотя у меня были идеи сделать более сложный механизм арифметики. Например (x + y * z — a) парсилось бы в (+*- x y z a) и интерпретатором вычислялось бы отдельно каждая операция. Т.е. сначала "+", потом "*" и потом "-". Мне кажется это выгоднее было-бы.
(x + 1 2 3)В такой форме записи вообще нет никакого смысла, если только не складывать всегда только два числа
Для красноглазых лисперов есть префиксная запись.
Или что «ой! мой святой лисп осквернили! фу...»?))
Не нравиться — ну допишите функционал сами. В чём проблема? Пул-реквесты к вашим услугам)
Или вы только прийти, покритиковать можете: «ой как неправильно, ой как плохо, фу...»?
"Возможно я добавлю такой синтаксис тоже в парсер"
Скорее добавляйте, иначе у вас получается странная смесь префиксной и инфиксной нотаций (см Википедию).
Но честно говоря форма (+ x y z) меня коробит побольше.
Ну так надо или осилить и привыкнуть, поскольку это натуральная запись AST-дерева и часть основной идеи языка (а зачем еще изучать новые языки, если они не меняют образа мышления?), или таки доделать DSL для этих операций "до натурального". Tcl, который "с намеком на лисп, но как шелл-команды и аргументы", пошел по второму пути.
сделать более сложный механизм арифметики. Например (x + y z — a) парсилось бы в (+ — x y z a)
(Обратную) польскую нотацию переизобретаем? вот на Форте еще попробовать самое то было бы, для прокачки мозга
Спасибо, я лучше в Схему.
А почему про Mary Rose Cook в статье ни слова?
Префиксная нотация есть. Инфексную — переделывает в префиксную парсер. Интерпритатор соответственно работает только с префиксной.
У вас проблемы с чтением текстов на русском языке?
поэтому ориентируюсь на историю комиттов.
А я вот напрягся и посмотрел:
github.com/maryrosecook/littlelisp/blob/master/littlelisp.js — 138 строк кода.
github.com/SaemonZixel/littlelisp.js/blob/master/littlelisp.js — 2012 строк кода.
И беглым взглядом разница сильно видна.
Изначальный вариант Mary Rose Cook мне кстати понравился больше. Он простой и понятный.
А вот у автора жесть яваскриптовая конечно.
На странице проекта в гитхабе Mary Rose Cook упомянута в первых строках. Так, что уважение проявлено достаточно.
Вы как-то с ним связаны?
Да. Мы вместе говорим на русском языке, знаем js и интересуемся лиспом. Этого достаточно?
И тут происходит взрыв на макаронной фабрике.
Зачётно. Посмеялся)))
Понять для чего нужна префиксная нотация?
Так онаж и так есть? в чём претензия то?)))
Просто добавили немного инфиксной записи для яваскриптологов.
Зачем нужен TCO?
Автор же написал, что не почувствовал нужды в рекурсиях, поскольку добавил while. Только совсем зелёный начинающий программист не знает про TCO. Так, что я думаю автор хорошо знает зачем TCO нужен.
Для чего макросы и чем они лучше хардкода в парсере?
Может потому, что хардкод на яваскрипте компилируется в машкод и работает быстрее чем макросы? не?
Хотя согласен, макросов не хватает конечно. Без него этот лисп похож на огрызок.
… много строк кода, но вот по делу ли они написаны?
Ну вот и выясните. И напишите статью на Хабре в стиле: «Я считаю LittleLisp.js %овно!»)) Получите ещё дополнительные плюсы к карме;)
Я молчу потому, что я разочарован, что мои разработки были приняты столь негативно и мои комментарии минусуют. Это мой первый проект вынесенный на публичное рассмотрение. Сейчас я несколько охладел к Lisp-у.
Если-бы написали конструктивные рекомендации что и как стоит добавить, яб с радостью это обсудил бы. И добавил бы если это возможно.
Не надо ругаться коллеги-программисты:)
Еслиб я заранее знал про макросы и многие другие особенности Lisp-a яб не брался за этот проект. Меня привлекла простота Lisp-а на поверхностный взгляд. Сейчас я вижу, что он сложнее чем Smalltalk:(
У меня основной упор был сделан на создание хорошего дебаггера. По этому парсер и интерпретатор были полностью переписаны. И от старого проекта осталось только часть описания Context, пара строк сначала и несколько строк в конце скрипта littlelisp.js. Ну и название частично.
Вобщем-то, весь старый оригинальный функционал был удалён.
В любом случае я признателен Mary Rose Cook за её реализацию Lisp-a. Считаю, что её реализация замечательна и прекрасно. Это меня и вдохновило форкнуть и расширить функционал.
Но пришлось всё переписать по своему чтоб внедрить дебаггинг. И от её красоты, к сожалению, ничего не сохранилось :(
В 1.0beta3 я добавил tail-call optimization для экономии оперативной памяти. Теперь обнаруживается хвостовая рекурсию и переиспользуется текущий контекст функции.
С макросами пока-что тяжело идёт дело, к сожалению. Не могу обещать сроков.
Я молчу потому, что я разочарован, что мои разработки были приняты столь негативно и мои комментарии минусуют.С таким настроением, вы слона не продадите. Понимаете, если критикует и минусует сразу много народу, есть вероятность, что делают они это не по злобе, а по делу.
Если-бы написали конструктивные рекомендацииУберите хардкод из парсера и сделайте макросы. Как вам такая рекомендация? Достаточно конструктивно?
Еслиб я заранее знал про макросы и многие другие особенности Lisp-a яб не брался за этот проект.Ну если нет, то конечно нет. Хозяин-барин.
Меня привлекла простота Lisp-а на поверхностный взгляд.Так вы эту простоту и разрушаете. Lisp прост за счёт того, в частности, что код не отличается от данных (а макросы от программ, просто работают не с данными а с кодом). Или, к примеру, за счёт единообразия всех выражений (парсер получается максимально простым и не надо морочиться с тем, что означают конструкции (1 + 2 3)).
У меня основной упор был сделан на создание хорошего дебаггера.Это good.
По этому парсер и интерпретатор были полностью переписаны.Это bad (по хорошему, стоило понять идеологию Lisp и переписывать уже в её рамках). Но опять же, никто не заставляет. Пусть будет ещё один странный Lisp не понятый автором и не принятый общественностью.
я признателен Mary Rose Cook за её реализацию Lisp-aЭто вопрос вашей совести. Признательны — хорошо. Не упомянули — ваше дело.
Успехов вам в дальнейшем творчестве.
Пусть будет ещё один странный Lisp не понятый автором и не принятый общественностью.
Какого вы высокого мнения о себе однако! Говорите от лица общественности. Выдаёте разрешение на существование нового лиспа. Берётесь судить всё и вся как будто вы обладаете абсолютной истиной. Прям юношеский максимализм. Не удивлюсь что вы до сих пор в школе учитесь.
Общественность, знаете, очень разная. И кому-то нравиться, кому-то не очень, а кому-то очень не очень. Не надо говорить за всех. И тем более выдавать свои убеждения за абсолютную истину. Это неуважительно к другим. И частенько унизительно и оскорбительно.
… и минусует сразу много народу, есть вероятность, что делают они это не по злобе, а по делу.
Обычно по личной неприязни.
Взрослые культурные люди избегают минусовать. Вместо этого пишут конструктивно и аргументированно, что им не нравиться. Чтоб автор мог что-то ответить, объяснить, как-то защититься.
Минусуют красноглазые фанатики и школьники: «фу, мне не нравиться, минусну...».
Это Хабр. Здесь все со всеми беседуют. Хотите один на один — личная переписка к вашим услугам.
Какого вы высокого мнения о себе однако! Говорите от лица общественности.
Говорит вполне справедливо, прочитав другие ветки.
Берётесь судить всё и вся как будто вы обладаете абсолютной истиной. Прям юношеский максимализм.
Вы, милейший, занимаетесь тем же самым гораздо более упорно, чем господин, с которым вы вступили в разговор.
Взрослые культурные люди избегают минусовать. Вместо этого пишут конструктивно и аргументированно
Вы, видимо, во вселенной параллельной моей живете. Это никак не характеристика взрослого человека. Так поступают люди, у которых есть время и желание вступать в разговор. Систему оценивания просто так ввели? Сомневаюсь. К тому же, тут уже несколько раз доходчиво высказывали вполне себе конструктивную критику. Или вы с этим не согласны?
Опа! Я оказывается прям дурак дураком.
Перепрочтите, пожалуйста, ветку. Дураком вас никто не называл, это, зачем-то, в своем сообщении сделали вы сами. К слову, скобочка в конце предложения не сделает ваше сообщение смешным.
Говорит вполне справедливо, прочитав другие ветки.
А я считаю, что нет. Или только вы и он обладаете абсолютной истинной, а я соответственно неправ и заблуждаюсь?
Вы, милейший, занимаетесь тем же самым гораздо более упорно, чем господин, с которым вы вступили в разговор.
Всегда приятно тролить критикующих личностей уверенных, что они уж точно знают истинную истину, и те кто думают по другому — полностью неправы)
Вы, видимо, во вселенной параллельной моей живете.
Да я живу во вселенной более уважающих и образованных людей, не счищающих, что есть только одна истинна, а всё остальное ложь и ерись И надо им на это указать, убедить для ихнего же блага (принести им «свет истины»). Там много истин и все они истинные. По этому они чужую истину уважают и не критикуют. А свою истину высказывают в виде мнения, начиная словами: «Я так думаю… я считаю… мой опыт говорит… я убеждён… сомневаюсь… и т.д.»
А не прямо и категорично: «Это никак не характеристика взрослого человека.» Ну да, конечно, вам виднее, вы обладаете истиной, а я нет. Сказанул глупость. Наверное потому, что дурак. И конечно же сейчас вы меня просветите как устроен в реальности мир, мне же во благо…
Это всего лишь ваше мнение. Не надо его выдавать за абсолютную истину.
«Я считаю (или убеждён) что это не является характеристикой взрослого человека». Ну, окей. Не считает и не считает. Его дело. Я пойду своей дорогой.
Так поступают люди, у которых есть время и желание вступать в разговор.
Так поступают уважающие люди. Минуснуть и не объяснить хотябы одной строкой — это неуважительно.
Значит теперь еще раз, кратко резюмирую смысл своего предыдущего сообщения. Вы, уважаемый, во всем посте только и делаете, что разводите полемику, переходите на личности(хотя достаточно мягко и почти незаметно), ставите себя выше других, оправдывая это тем, что другие ставят себя выше других. Про подмену понятий я уже упоминал. Уважающие люди (хотя кого они должны уважать?) так не поступают.
А свою истину высказывают в виде мнения, начиная словами: «Я так думаю… я считаю… мой опыт говорит… я убеждён… сомневаюсь… и т.д.»
Так поступают уважающие люди.
Считаю, что сказанного уже достаточно.
Согласитесь, это довольно подозрительно когда только что созданный аккаунт, без какой либо предыстории, комментирует исключительно автора первой и пока единственной статьи, один одинёшенек...
Конечно, а кто захочет с вами общаться? Только троли;)
...(всем остальным на эту статью, в лучшем случае, наплевать).
Всем просто на вас наплевать. Всем ясно, что вам лижбы покритиковать да своё мнение протолкнуть как абсолютную истину. Уважалиб мнение других, давноб этот срачь закончился бы.
Характерные орфографические ошибки в ваших комментах и исходниках на GitHub-е также намекают.
Вау! Круто! Новый тип вещдока: характерные орфографические ошибки! О ужос, я ошибаюсь в тех же словах, что и автор! Это провал…
Желаете общаться — выходите из сумрака.
Да никому с вами неприятно общаться. Вот все и проходят мимо.
Перестаньте работать на публику.
Какая публика, вы чё? Все уже давно перестали читать этот срачь. Остались только красноглазые фонатики, которые воюют за чистоту лисп-мира, и троли))))
Еще в нулевых аналогичные проекты существовали, только тогда заменяли шаблонизацию HTML тоже на лисп:
(defmacro with-menu-html (name &body body)
`(with-html-output-to-string (*standard-output* nil :prologue t :indent t)
(:html (:head (:title ,name)
(:link :rel "Stylesheet" :type "text/css" :href "/main.css"))
(:body
(:div :class "allcontainer"
(make-main-menu)
(:div :class "contentcontainer"
,@body
(:div :class "sourcelink"
(:a :href "/forums.lisp" "source"))))))))
(defun make-main-menu ()
(with-html-output (*standard-output* nil :indent t)
(:div :class "mainmenucontainer"
(:ul :class "mainmenu"
(dolist (item +all-locations+)
(make-main-menu-item item (string-equal (format nil "/tbnl/~a" item) (script-name))))))))
(defun make-post-row (post)
(with-html-output (*standard-output* nil :indent t)
(:div :class "postcontainer"
(:div :class "postheader"
(:span :class "postname"
(str (gethash "name" post)))
(:span :class "posttime"
(str (gethash "time" post))))
(:div :class "postbody"
(:span :class "postpost"
(str (gethash "post" post)))))))
(defun make-new-post-form (topicid)
(with-html-output (*standard-output* nil :indent nil)
(:div :class "formcontainer"
(:form :method :post :enctype "multipart/form-data" :action "/tbnl/new-post"
(:div :class "formnamefield"
(:p "Name:" (:input :type :text :name "name")))
(:div :class "formpostfield"
(:p "Body:" (:br) (:textarea :name "post" :rows 10 :cols 30 "")))
(:div :class "formsubmitfield"
(:p (:input :type :hidden :name "topicid" :value topicid)
(:input :type :submit)))))))
(defun new-post ()
(let ((topicid (parameter "topicid"))
(name (parameter "name"))
(post (parameter "post")))
(when (and topicid name post)
(make-new-post* topicid (make-safe-html-string name) (make-safe-html-string post))
(redirect (format nil "/tbnl/show-topic?topicid=~a" topicid)))
(redirect "/tbnl/index")))
и т.д.
1. http веб-сервер на BASH — habr.com/ru/post/37245
2. к нему Lisp на Python в 90 строк!!! habr.com/ru/post/115206
3. Игрушечная БД на Python dev-gang.ru/article/how-to-write-a-simple-toy-database-in-python-within-minutes-uo1kahsydh
4. Веб сайт с фронтендом на Lisp написанном на JS
И получится отличный минимальный игрушечный веб сервер на котором легко можно будет проследить всё от БД->Lisp->HTTP->(страница на JS-Lisp)
Почему бы не сделать свой Lisp для веба?