LINUX.ORG.RU

clcon - новая IDE для Common Lisp. Выбираем фичи для пре-альфа-релиза

 , , ,


1

4

Тема началась здесь, но надо завести новую, а то важное сообщение залистнётся.

У меня есть написанный на SWANK/tcl/tk прототип IDE для Common Lisp. Сайт проекта clcon. Снимок экрана.

Текущая цель - простая и легковесная IDE для обучения (альтернатива SLIME), устанавливаемая «за один щелчок». Пермиссивная лицензия.

Текущие фичи:

  • REPL
  • Поиск определения
  • Completion
  • Инспектор
  • Дебаггер

Все фичи имеют ограничения, это скорее прототип чем что-то рабочее.

До того, как попытаться собрать подобие релиза, хочу сделать ещё пару фич. Вот список. Весь список не осилю. Собираю голоса, кому что больше интересно. Ну и заодно хочу понять, будет ли кто-то загружать эту игрушку или нет.

  • 1. табы как в файрфоксе для листания файлов в редакторе (сейчас листание окон примерно как list-buffers в емаксе)
  • 2. интеграция со справкой (CLHS, docstring, quickdocs)
  • 3. slime-who-calls и т.п.
  • 4. grep
  • 5. размещение окон по экрану
  • 6. автоотступы

Жду от вас деклараций вида: «если будут фичи N1,N2 и N3, то я готов буду посмотреть твою поделку».

P.S. ожидаю вопросов «а будешь ли добавлять другие языки». Отвечаю: да. Но пока об этом рано говорить.

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

Не стал пока убирать зависимость. Вместо этого добавил несколько команд лиспового режима - дёшево и сердито.

Призываю Gentooshnik - ты писал:

Использую emacs, но готов легко расстаться в пользу чего-то другого, если там будут slime, paredit и evil-mode. Первое, как я понял, у тебя уже есть. Готов глянуть твою поделку если будут любые два.

Вот здесь есть снимок экрана.

https://bitbucket.org/budden/clcon/wiki/Home

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

Зачтётся данное меню за прототип paredit? До реально полезной IDE нам ещё далеко, например, нет сохранения файла и смены пакетов. Однако хочу попробовать сделать релиз для установки «одной кнопкой». Там будет собранный образ SBCL и... не знаю, что ещё.

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

Там будет собранный образ SBCL и... не знаю, что ещё.

quicklisp, linedit. Возможно, гуй к quicklisp (мне и консоль норм, но для «starter pack» - то что надо)

Зачтётся данное меню за прототип paredit?

Там всё по перемещению курсора, так не интересно. :) Сделай forward/backward-slurp/barf-sexp и splice-sexp-killing-backward/forward. http://emacswiki.org/emacs/PareditCheatsheet

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

Там всё по перемещению курсора, так не интересно. :)

Почему, не всё. transpose-forms и indent-new-line меняют текст. Тебе эти экзотические команды, о которых я только что узнал, для реальной жизни нужны или для проверки состоятельности моей поделки?

Проблема тут прежде всего с дизайном. Работа в емаксе подразумевает наличие команд kill. Кроме того, в EMACS есть prefix-argument. «Блокнотная быдлотрадиция» говорит, что если ты хочешь что-то вырезать, сначала это надо пометить. Обсуждение, что лучше, выходит за рамки данной темы. Но ясно, что «быдлотрадиция» больше подходит для начинающих и что не все команды EMACS в неё легко укладываются. Например, как пометить форму, в которой находится курсор? Я попытался это слёту сделать и понял, что без указания уровня это не имеет смысла. Потому что если курсор стоит посреди символа, то формой, содержащей курсор, является символ. Минимально полезная команда могла бы выглядеть так:

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

Ресурсов на дизайнерские усилия у меня явно сейчас нет. Я взял те команды, которые были в одуванчике, да и то пришлось кое-что менять.

Тем временем у меня вроде заработала невидимая версия одуванчика, независимая от X. Хотя это ещё нужно выяснить...

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

Впрочем, если ты найдёшь исходники этих команд на common lisp под пермиссивной лицензией в любом из клонов емакса, то я попробую их воткнуть. Но они не будут ничего класть в буфер обмена - будут просто стирать.

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

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

Скриншоты здесь:

https://bitbucket.org/budden/clcon/wiki/Screenshots

Принято решение: не буду больше добавлять фич. Единственное, надо сделать, чтобы не валился при возникновении исключения в редакторе. Это несколько строчке, но может занять полдня.

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

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

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

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

В качестве запускалок под офтопик можно использовать tclkit или freewrap.

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

den73 с другого компа

Я с вашего позволения добавлю на память: http://wiki.tcl.tk/20057

# ttknote.tcl --
#
# This demonstration script creates a toplevel window containing a Ttk
# notebook widget.

package require Tk

set w .ttknote

catch {destroy $w}
toplevel $w

## See Code / Dismiss

ttk::frame $w.f
pack $w.f -fill both -expand 1
set w $w.f

## Make the notebook and set up Ctrl+Tab traversal
ttk::notebook $w.note
pack $w.note -fill both -expand 1 -padx 2 -pady 3
ttk::notebook::enableTraversal $w.note

## Popuplate the first pane
ttk::frame $w.note.msg
ttk::label $w.note.msg.m -wraplength 4i -justify left -anchor n -text "Ttk is the new Tk themed widget set. 

notebook page heading itself is selected. Note that the second tab is disabled, and cannot be selected."
ttk::button $w.note.msg.b -text "Neat!" -underline 0 -command {
    set neat "Yeah, I know..."
    after 500 {set neat {}}
}
bind $w <Alt-n> "focus $w.note.msg.b; $w.note.msg.b invoke"
ttk::label $w.note.msg.l -textvariable neat
$w.note add $w.note.msg -text "Description" -underline 0 -padding 2
grid $w.note.msg.m - -sticky new -pady 2
grid $w.note.msg.b $w.note.msg.l -pady {2 4}
grid rowconfigure $w.note.msg 1 -weight 1
grid columnconfigure $w.note.msg {0 1} -weight 1 -uniform 1

## Populate the second pane. Note that the content doesn't really matter
ttk::frame $w.note.disabled
$w.note add $w.note.disabled -text "Disabled" 

## Popuplate the third pane
ttk::frame $w.note.editor
$w.note add $w.note.editor -text "Text Editor" -underline 0
text $w.note.editor.t -width 40 -height 10 -wrap char \
	-yscroll "$w.note.editor.s set"
ttk::scrollbar $w.note.editor.s -orient vertical -command "$w.note.editor.t yview"
pack $w.note.editor.s -side right -fill y -padx {0 2} -pady 2
pack $w.note.editor.t -fill both -expand 1 -pady 2 -padx {2 0}

ttk::notebook::enableTraversal $w.note 
bind $w.note <<NotebookTabChanged>> {
  if {[$w.note index current] == 1} {
     $w.note select 2
  }
}
anonymous
()
Ответ на: комментарий от den73

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

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

Официально запрашиваю помощь в сборке запускалки под офтопик

$ cd freewrap
#     |
#     |-- linux64/
#     |-- win32/
#
$ linux64/freewrap myapp.tcl -w ../win32/freewrap.exe -o myapp.exe
$ ls -l myapp.exe
anonymous
()
Ответ на: комментарий от anonymous

Спасибо за советы! Хотя мне в общем-то не нужен *.exe - мне нужно, чтобы не было зависимости от другого инсталлятора, скажем, от ActiveTcl. Хотя на данном этапе может быть и это стерплю.

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

Подсветку не осилил, сроки вышли. Зато сделал набросок обычной подсветки синтаксиса, см «скриншот дня» https://bitbucket.org/budden/clcon/wiki/Home . До подсветки скобок вроде бы остаётся рукой подать, но обычная подсветка пока не работает (редактор почти сразу зависает). Это было ожидаемо - нет правильной последовательности вызовов.

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

Ну, посмотри, а можешь и не смотреть. Более интересно заполучить твои команды рефакторинга. Вот если это посмотришь - будет интереснее.

Всё, набор фич закончен, теперь нужно сделать файловый релиз.

den73 ★★★★★
() автор топика

Цели проекта изменены. Полноценная IDE - это ещё много работы. На comp.lang.lisp мне сказали, что отступы должны быть как в емаксе. И т.д., и т.п. Поэтому поставил более скромную цель - сделать гуй и инсталлятор для своей «старой» программы https://bitbucket.org/budden/cl-stirling-engine - без гуя ей практически никто, кроме меня, не может пользоваться.

В такой постановке не нужно всё вылизывать - главное, чтобы хоть как-то работало.

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

Коротко: пермиссивная лицензия, стиль управления больше похож на обычные IDE.

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

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

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

Паст твой посмотрел. Это хорошо как концепт, но это не рабочий инструмент пока что, по ряду практических причин:

  1. Пропадут комментарии
  2. Что будет с #+?
  3. Что будет с любыми другими объектами, которые особым образом читаются?

Здесь нужен правильный ридер. У меня есть кое-что, но недостаточно для рефакторинга.

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

Мне интересно, а если я добавлю питоний режим, это выведет мой проект в лидеры движения опен-соурс?

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

У меня есть нормальный ридер, написанный на лиспе. Но допилить его до парсера линзы будет совсем нелегко, причём проблемы носят принципиальный характер и проистекают из гибкости лиспа. А именно, макро-буквы. Самое страшное - это побочные эффекты в них, например,

#.(quit)

Т.е. любой ридер не будет универсальным. Лучшее, что мы сможем сделать, это корректно ругаться при появлении каких-то нестандартных макро-букв. Но даже отличить стандартную таблицу чтения от нестандартной может оказаться невозможно. Как вариант, copy-readtable имеет полное право назначать на те же макро-буквы идентичные функционально, но не eq замыкания. Тогда мы теряем возможность сравнения таблиц чтения.

Задача интересная, конечно, но я не готов за неё взяться.

P.S. Ух ты, вот что попалось:

http://www.norvig.com/ltd/code/read.lisp

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

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

Но это так в одуванчике, я только разместил объяву :) К сожалению, сам редактор всё ещё работает не слишком надёжно.

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

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

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