LINUX.ORG.RU
Ответ на: комментарий от tp_for_my_bunghole

Chez Scheme не знает об этих типах. Racket считается DSL реализованом на Chez Scheme в котором есть функционал от Lisp, как symbol properties.

И что?

(: fn (-> (Cons Integer Integer) Integer))
(define (fn x) (car x))

транслируется в (unsafe-car x), так как заведомо известно, что x является cons.

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

колоссальной разницы между DrRacket и Emacs не заметил

Основная разница — стрелки: https://dl.flathub.org/repo/screenshots/org.racket_lang.Racket-stable/1248x702/org.racket_lang.Racket-e431eb96afe3a039f6027b0e519e76e2.png

И разный цвет для изменяемого и неизменяемого значения.

И адекватная поддержка всех языков на базе Racket (разделение литералов, переменных и служебных слов, а также возможность вставки изображений в код): https://wrigstad.com/popl13/scratchy.png

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

Основная разница — стрелки

А да, прикольная тема, но это чем то отличается от того, когда редактор подсвечивает тебе символ под курсором в исходнике?

А про картинке в коде: я с изображениями не работаю (разве что в матлабе иногда надо что то склеить или убрать шум), поэтому сложно сказать удобно это или нет. Осмелюсь только предположить, что это может создавать визуальный шум, особенно, если изображение большое. Или можно задавать максимальный размер изображения? А еще вопрос: с REPL это работает, чтобы можно было продемонстрировать изменения изображения после каждого этапа обработки? Мне бы пригодилось для такое демонстраций

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

А да, прикольная тема, но это чем то отличается от того, когда редактор подсвечивает тебе символ под курсором в исходнике?

Тем, что сразу видишь использование символа. Emacs ломается из-за того, что не может разобрать макросы, а в Racket информация о связях имён сохраняется.

Или можно задавать максимальный размер изображения?

В смысле? Как в HTML. Что хочешь, то и вставляешь. Можешь добровольно себя ограничить. Единственный недостаток: файл с изображением перестаёт быть текстовым. Поэтому использование достаточно ограниченное.

А еще вопрос: с REPL это работает, чтобы можно было продемонстрировать изменения изображения после каждого этапа обработки? Мне бы пригодилось для такое демонстраций

Конечно: https://docs.racket-lang.org/teachpack/2htdpimage.html

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

В смысле? Как в HTML. Что хочешь, то и вставляешь. Можешь добровольно себя ограничить.

Не знаю как в HTML. Условно говоря, чтобы при вставке 4к изображения оно не было большего исходника, который работает с этим изображением

Конечно: https://docs.racket-lang.org/teachpack/2htdpimage.html

Спасибо

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

Условно говоря, чтобы при вставке 4к изображения оно не было большего исходника, который работает с этим изображением

Нет. Так не работает.

В коде это аналог сишного #include "image.xpm", а в комментариях предполагается, что изображения иллюстрируют документацию. В обоих случаях не предполагается, что может попасться 4К изображение.

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

Emacs ломается из-за того, что не может разобрать макросы, а в Racket информация о связях имён сохраняется.

Ломается не Emacs а Geiser для Scheme.
DrRacket IDE написан учителями и иногда студентами.

Рисовать линии со стрелками поверх кода указывая использования имён/идентификаторов…
Студенты разные бывают.

Изображения в коде для школ. Идея от 1967, начальный учебный язык Logo. Считался диалектом Lisp.

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

Ломается не Emacs а Geiser для Scheme.

Ломается Emacs с Common Lisp. Попробуй найти использование переменной через SLIME. Или найти определение переменной, если она определена макросом.

Изображения в коде для школ.

Изображения в коде работают в любом нетекстовом языке. От Смоллтолка, Оберона до Holy C.

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

Ломается Emacs с Common Lisp. Попробуй найти использование переменной через SLIME. Или найти определение переменной, если она определена макросом.

Для чего всё это выдумываешь?

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

То есть три типовые задачи: «где меняется эта переменная», «откуда вызывается данная функция», «где определение данной переменной/функции». В DrRacket они решаются автоматически. В Emacs каждый раз не уверен, что получил все места вызова.

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

«откуда вызывается данная функция»

В исходном коде SBCL можно найти все точки где вызывается макро handler-case, аналог try/catch в других языках.
(для этого просто загрузить файл «load-xc.lisp» из SBCL)
240 точек включая SLIME, с учётом вложенности макросов.

Есть ещё типовая задача apropos, поиск всего по части имени.

«где определение данной переменной/функции»

Можешь поискать/прыгнуть на определения внутри Chez Scheme из DrRacket?

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

Есть ещё типовая задача 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 попробовать перейти прыгнуть на определения специальных форм.

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

Chez для Racket целевой язык, так же как ассемблер для SBCL. С таким же успехом можешь в SBCL попробовать перейти прыгнуть на определения специальных форм.

В SBCL только GC реализован на «C», это нужно для интеграции с ОС на «C».
Для сборки SBCL нужен любой(почти) Common Lisp.
Lispworks Common Lisp собирается только на своих предыдущих версиях. SBCL может собраться на интерпретаторе GNU CLISP, на Lispworks, Clozure CL, Allegro.

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

Проверил сейчас. Да, тот работает верно. Вот этот ломается:

(defvar x 1)

(defmacro mylet (a &rest body)
  `(let ((,a 2)) ,@body))

(mylet x
  (format t "~a" x)) ;; здесь по M-. кидает в defvar

(format t "~a" x)

mylet нужно развернуть и прыгать по X в развернутой форме. Разворачивать поставив курсор после всей формы, не на имя макро.

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

Можешь поискать/прыгнуть на определения SBCL внутри CLISP из Emacs?

Нет потому что это не DSL поверх Scheme, а машина.
Собрать SBCL и работать с образом.

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

mylet нужно развернуть и прыгать по X в развернутой форме.

И там он прыгнет на X в этой же развёрнутой форме. То, что он связан с x после mylet надо догадываться.

Например

(loop for for from 2 to 4
  collect (loop for for from for to 5 collect (cons x for)))

Как увидеть, откуда взяты x и for внутри cons? Разворачивать многострочного крокодила и искать в нём?

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

Как увидеть, откуда взяты x и for внутри cons?

x - free
for - bound, вложенный loop.

Разворачивать многострочного крокодила и искать в нём?

Читать код.

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

лучше поделитесь, что вы там такое все пишете на высоко-скобочных языках, типа лисп и внебрачные дети его…

а то верчу штуковину(сейчас guile) в руках, а применять почти некуда…

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

а то верчу штуковину(сейчас guile) в руках, а применять почти некуда…

GUIX, говорят заменяет весь software stack что есть для devops.
Сделано для пакетов ОС с возможностью откатов после upgrade.

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

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

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

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

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

Не публичный. Выглядит примерно так: https://snipboard.io/Q9wL0s.jpg

А с точки зрения языка удобство в том, что можно писать ссылку как, например, (td (a ([href ,(helpdesk-url helpdesk-edit-task id)]) ,(number->string id)))

И знать, что будет запущена функция helpdesk-edit-task с параметром id. А если не требуется, чтобы адреса были «красивые», то можно вообще адрес от замыкания формировать.

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

Функции не могут сделать странное. Они всегда выполняют все свои аргументы слева направо, затем вызывают тело функции, затем возвращают управление.

А макрос может развернуться во что угодно. Вот пример кода:

(use-package with)

(defvar x 1)

(with- (pt :new 'spoint)
  (setf x 10 y 20)
  pt)

(format t "~a" x) ; здесь ожидаешь увидеть 1 или 10?
monk ★★★★★
()
Ответ на: комментарий от tp_for_my_bunghole

И как его будешь при необходимости сопровождать или чинить? В DrRacket при наведении на x рядом с 10 у меня сразу будет стрелочка на defvar или на with- и будет очевидно, какой именно x здесь изменяется.

В Emacs придётся раскрывать макрос и в нём вручную искать нужную строку. Или искать хотя бы определение spoint. В любом случае намного дольше.

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

В DrRacket при наведении на x рядом с 10 у меня сразу будет стрелочка на defvar или на with- и будет очевидно, какой именно x здесь изменяется.

(defvar x 1)

(with- (pt :new 'spoint)
  (setf x 10 y 20)
  pt)

Здесь не «ожидать» надо, а узнать.
Макро «with-» из другого пакета. Экспортируется как API.

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

Могло быть. Но со всяких смартфонов удобнее классическое, так как оно под разрешение экрана подстраивается. И в Flutter стрелка назад в браузере не работает. И закладки на конкретное место интерфейса.

Мне в этом приложении даже ссылки убедили сделать вида /edit-task/1234, чтобы их хранить удобнее было. По умолчанию в Racket динамические ссылки вида /;(("k"%20.%20"(1%202%2021977576)")), которые живут пару часов, но в ссылке можно хранить произвольный контекст. То есть, не только имя функции и строковые или числовые параметры, а любое замыкание с любыми параметрами (ссылкой на базу данных, любую структуру, дисковый файл, …).

monk ★★★★★
()

Поделюсь впечатлениями от разных вариантов лиспов.

  • Clojure - наиболее практичный из всех. Есть нативные библиотеки почти ко всему, если нет нативных - можно прикрутить Java. Loop/recur выглядит странно.
  • Racket - тоже норм. Большой набор библиотек, и даже рабочих. Но смущают два вопроса. Первое - все-таки язык создавался для обучения. Второе - не забросят ли его в связи с тем что решили разрабатывать Rhombus.
  • Common Lisp - вещь в себе. Хз как к нему подступиться. Библиотека доступа к aws - не работает. Не понятно где его использовать, а для решения упражнений из учебника любой из перечисленных языков подходит.
Elidee
() автор топика
Ответ на: комментарий от Elidee

Второе - не забросят ли его в связи с тем что решили разрабатывать Rhombus.

По библиотекам там полная совместимость. Rhombus может использовать все модули для Racket. Также как до Racket была PLT Scheme.

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

Мне в этом приложении даже ссылки убедили сделать вида /edit-task/1234, чтобы их хранить удобнее было. По умолчанию в Racket динамические ссылки вида /;((«k»%20.%20"(1%202%2021977576)")), которые живут пару часов, но в ссылке можно хранить произвольный контекст. То есть, не только имя функции и строковые или числовые параметры, а любое замыкание с любыми параметрами (ссылкой на базу данных, любую структуру, дисковый файл, …).

Вы ведь сейчас не о хранении произвольного контекста в ссылке в адресной строке браузера, ведь не об этом же, да?

Obezyan
()