И разный цвет для изменяемого и неизменяемого значения.
И адекватная поддержка всех языков на базе Racket (разделение литералов, переменных и служебных слов, а также возможность вставки изображений в код): https://wrigstad.com/popl13/scratchy.png
А да, прикольная тема, но это чем то отличается от того, когда редактор подсвечивает тебе символ под курсором в исходнике?
А про картинке в коде: я с изображениями не работаю (разве что в матлабе иногда надо что то склеить или убрать шум), поэтому сложно сказать удобно это или нет. Осмелюсь только предположить, что это может создавать визуальный шум, особенно, если изображение большое. Или можно задавать максимальный размер изображения? А еще вопрос: с REPL это работает, чтобы можно было продемонстрировать изменения изображения после каждого этапа обработки? Мне бы пригодилось для такое демонстраций
А да, прикольная тема, но это чем то отличается от того, когда редактор подсвечивает тебе символ под курсором в исходнике?
Тем, что сразу видишь использование символа. Emacs ломается из-за того, что не может разобрать макросы, а в Racket информация о связях имён сохраняется.
Или можно задавать максимальный размер изображения?
В смысле? Как в HTML. Что хочешь, то и вставляешь. Можешь добровольно себя ограничить. Единственный недостаток: файл с
изображением перестаёт быть текстовым. Поэтому использование достаточно ограниченное.
А еще вопрос: с REPL это работает, чтобы можно было продемонстрировать изменения изображения после каждого этапа обработки? Мне бы пригодилось для такое демонстраций
Условно говоря, чтобы при вставке 4к изображения оно не было большего исходника, который работает с этим изображением
Нет. Так не работает.
В коде это аналог сишного #include "image.xpm", а в комментариях
предполагается, что изображения иллюстрируют документацию. В обоих
случаях не предполагается, что может попасться 4К изображение.
То есть три типовые задачи: «где меняется эта переменная», «откуда вызывается данная функция», «где определение данной переменной/функции». В DrRacket они решаются автоматически. В Emacs каждый раз не уверен, что получил все места вызова.
В исходном коде SBCL можно найти все точки где вызывается макро handler-case, аналог try/catch в других языках.
(для этого просто загрузить файл «load-xc.lisp» из SBCL)
240 точек включая SLIME, с учётом вложенности макросов.
Есть ещё типовая задача apropos, поиск всего по части имени.
«где определение данной переменной/функции»
Можешь поискать/прыгнуть на определения внутри Chez Scheme из DrRacket?
Есть ещё типовая задача apropos, поиск всего по части имени.
Вот и я про то же. Emacs не видит семантику. Только текст.
(defvar x 1)
(let ((x 2))
(format t "~a" x)) ; если сюда сделать поиск определения, выдаст не let, а defvar
Аналог в Racket
(define x 1) ; если навести, покажет, что не используется и эту строку можно удалять
(let ((x 2))
(printf "~a" x)) ; Здесь x покажет на начало let
Можешь поискать/прыгнуть на определения внутри Chez Scheme из DrRacket?
Chez для Racket целевой язык, так же как ассемблер для SBCL. С таким же успехом можешь в SBCL попробовать перейти прыгнуть на определения специальных форм.
Chez для Racket целевой язык, так же как ассемблер для SBCL. С таким же успехом можешь в SBCL попробовать перейти прыгнуть на определения специальных форм.
В SBCL только GC реализован на «C», это нужно для интеграции с ОС на «C».
Для сборки SBCL нужен любой(почти) Common Lisp.
Lispworks Common Lisp собирается только на своих предыдущих версиях. SBCL может собраться на интерпретаторе GNU CLISP, на Lispworks, Clozure CL, Allegro.
про guix читал. но это готовый продукт, для домашнего неспешного пользователя убунты, слишком мощноват, да и экспериментровать с компом неохота. пользуюсь штатными средствами
Наличие стрелочек позволяет избежать опечаток. Сразу видно, если переменная не определена или определена где-то намного выше. При этом не надо на каждую тыкать M-. - всё видно сразу по мере печати.
А с точки зрения языка удобство в том, что можно писать ссылку как, например, (td (a ([href ,(helpdesk-url helpdesk-edit-task id)]) ,(number->string id)))
И знать, что будет запущена функция helpdesk-edit-task с параметром id. А если не требуется, чтобы адреса были «красивые», то можно вообще адрес от замыкания формировать.
И как его будешь при необходимости сопровождать или чинить? В DrRacket при наведении на x рядом с 10 у меня сразу будет стрелочка на defvar или на with- и будет очевидно, какой именно x здесь изменяется.
В Emacs придётся раскрывать макрос и в нём вручную искать нужную строку. Или искать хотя бы определение spoint. В любом случае намного дольше.
Могло быть. Но со всяких смартфонов удобнее классическое, так как оно под разрешение экрана подстраивается. И в Flutter стрелка назад в браузере не работает. И закладки на конкретное место интерфейса.
Мне в этом приложении даже ссылки убедили сделать вида /edit-task/1234, чтобы их хранить удобнее было. По умолчанию в Racket динамические ссылки вида /;(("k"%20.%20"(1%202%2021977576)")), которые живут пару часов, но в ссылке можно хранить произвольный контекст. То есть, не только имя функции и строковые или числовые параметры, а любое замыкание с любыми параметрами (ссылкой на базу данных, любую структуру, дисковый файл, …).
Поделюсь впечатлениями от разных вариантов лиспов.
Clojure - наиболее практичный из всех. Есть нативные библиотеки почти ко всему, если нет нативных - можно прикрутить Java. Loop/recur выглядит странно.
Racket - тоже норм. Большой набор библиотек, и даже рабочих. Но смущают два вопроса. Первое - все-таки язык создавался для обучения. Второе - не забросят ли его в связи с тем что решили разрабатывать Rhombus.
Common Lisp - вещь в себе. Хз как к нему подступиться. Библиотека доступа к aws - не работает. Не понятно где его использовать, а для решения упражнений из учебника любой из перечисленных языков подходит.
Мне в этом приложении даже ссылки убедили сделать вида /edit-task/1234, чтобы их хранить удобнее было. По умолчанию в Racket динамические ссылки вида /;((«k»%20.%20"(1%202%2021977576)")), которые живут пару часов, но в ссылке можно хранить произвольный контекст. То есть, не только имя функции и строковые или числовые параметры, а любое замыкание с любыми параметрами (ссылкой на базу данных, любую структуру, дисковый файл, …).
Вы ведь сейчас не о хранении произвольного контекста в ссылке в адресной строке браузера, ведь не об этом же, да?