LINUX.ORG.RU

Посоветуйте язык с мощным консольным repl-ом

 ,


0

3

Есть некоторое внутреннее API, которое хочется «оживить» с помощью настоящего языка программирования, ибо конвейеры из grep/sed/awk с cli-тулзой тяжелы в написании/понимании/эксплуатации. В связи с этим хочется иметь язык, в который я впихну имеющиеся вызовы, красиво их оберну и буду наслаждаться использованием.

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

В идеале хотелось бы, чтобы язык: - имел именованные параметры у функций - имел консольный REPL с историей с действительно умным дополнением (в частности, предлагал эти самые именованные параметры) - имел выразительные структуры данных (вот по этому пункту лисп с его s-exp'ами явный фаворит, т. к. через keyword'ы + s-exp выражается практически вся моя предметная область) - дружил с C++ (желательно без swig, т. к. на моей памяти отображение 1-в-1 ни разу не выглядело «родным и удобным» для целевого языка) на самом примитивном уровне: временем жизни плюсовых объектов я хочу управлять сам

О чем слышал:

  • для python-а есть ipython, с двумя вариантами: браузерная и qt-шная консоль — выглядит вкусно, но в ssh с таким не побалуешь
  • для lisp-а есть slime, однако комплит в нем подозрительно тупой:
    (defun my-sum (&key arg-1 arg-2)
      (+ arg-1 arg-2))
    (my-sum :arg-1 1 :arg-2 2)
    
    во-первых, arg-1 и arg-2 не предлагаются к дополнению внутри функции (точнее говоря, предлагается куча разного всякого г-на, на фоне которых аргументы теряются) во-вторых, при вызове этой функции keyword-ы для именованных аргументов также предлагаются в последнюю очередь

В каком направлении можно покопать? Или плюнуть на все, писать свой парсер для s-exp'ов к readline и костылить нужное мне дополнение полностью вручную (выглядит жуть как геморно, я лучше с sed/grep/awk посношаюсь)?

для python-а есть ipython, с двумя вариантами: браузерная и qt-шная консоль — выглядит вкусно, но в ssh с таким не побалуешь

ipython умеет в обычном терминале, спокойно работает через ssh. Браузерный вариант через тот же ssh спокойно пробрасываеттся если очень надо.

x3al ★★★★★
()

для python-а есть ipython, с двумя вариантами: браузерная и qt-шная консоль — выглядит вкусно, но в ssh с таким не побалуешь

Так ведь сам ipython консольный, что мешает использовать его через SSH?

MrClon ★★★★★
()

Однозначно лисп, так как он не просто даёт REPL, но и к нему ещё прилагается весьма мощный язык, заточенный на интерактивную разработку. Рекомендую SBCL + linedit. Можешь глянуть ещё мою поделку, sbcl-readline, она чуть фичастее, но и чуть глючнее. В ней кейворды предлагаются исходя из сигнатуры функции, как ты хочешь. Правда, я уже давно не щупал linedit, может, там уже тоже это есть.

С C++ напрямую SBCL работать не будет, я обычно просто делаю C API и подключаю через CFFI. C API придётся делать в любом случае из-за name mangling в C++. swig может помочь это автоматизировать, но вручную обычно получается чище.

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

Можешь глянуть ещё мою поделку, sbcl-readline.

Выглядит интересно. Упоротых зависимостей нет, как в linedit, только...

1. Если хочешь, чтобы число пользователей стало больше одного - отправь в quicklisp. 2. У меня уже есть пулл-реквест (пока банальный рефакторинг), но как его отправить? Положи проект на гитхаб/битбакет.

Gentooshnik ★★★★★
()

node.js имеет хороший консольный интерфейс. Там и автодополнения и выделения цветом. Неплохой интерфейс у GHCi, но это для любителей функциональных языков. Да и подключить весьма трудно будет к проекту.

Aswed ★★★★★
()

посмотри picolisp

Язык удобный, мощный, но при этом очень маленький. Автокомплит в консоле из коробки, удобный repl с vi- или emacs-подобным биндингом.

Интегрируется с С и Явой напрямую. Для работы с С++ нужно использовать «extern C»

anonymous
()

perl

Completion plugin - extensible tab completion

DDS plugin - better format results with Data::Dump::Streamer

DDC plugin - even better format results with Data::Dumper::Concise

INC completion driver - tab complete module names in use and require

Interrupt plugin - traps SIGINT to kill long-running lines

Keywords completion driver - tab complete Perl keywords and operators

LexEnv plugin - variables declared with «my» persist between statements

MultiLine::PPI plugin - continue reading lines until all blocks are closed

Nopaste plugin - upload a session\'s input and output to a Pastebin

PPI plugin - PPI dumping of Perl code

Refresh plugin - automatically reload libraries with Module::Refresh

https://metacpan.org/pod/Devel::REPL

Deleted
()
Ответ на: perl от Deleted

Мне именованные аргументы нужны, а в перле у функций аргументов в принципе не бывает. До сих пор с $_ крутятся-вертятся.

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от cherry-pick

ghci подойдет?

А как в хаскелле выглядят именованные параметры?

Собственно, есть функция, скажем

(defun weather-request (&key (city 'default-city) (date (get-universal-time)))
  ;; invoke native function to do the job
  ;; return response object
)

У ее аргументов имеют место быть дефолтные значения, которые можно переопределить (в общем случае еще есть обязательные параметры). Требуется предоставить комплит для имен опциональных параметров. Причем эта самая таблица имен опциональных параметров растет из кода плюсовой библиотеки (т. е. идеально было бы создавать функции из плюсового кода, что вроде как можно делать с ecl и python).

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

Чем тебе shell не REPL? Если уже все готово, просто заверни это в функции/скрипты.

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

Чем тебе shell не REPL?

Тем, что манипуляция данными в шелле недоразвита. Это DSL для запуска команд. В нем можно писать весьма сложные программы, но это, кхм, редко когда удобно делать.

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

1. Если хочешь, чтобы число пользователей стало больше одного - отправь в quicklisp.

Хм, я подумаю над этим.

2. У меня уже есть пулл-реквест (пока банальный рефакторинг), но как его отправить? Положи проект на гитхаб/битбакет.

OK: https://github.com/jini-zh/sbcl-readline. Там есть ветка next, в которую скинуты изменения, ещё не опубликованные на моём сайте. Постараюсь не забыть вынести её в релиз немного позже, потому что там есть важные изменения --- правка поломки в интерфейсе дебаггера в sbcl-1.11.1 и отлажена работа с юникодом. Может, ещё что-то, я уже не помню...

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

а в перле у функций аргументов в принципе не бывает

Ты не прав, в принципе бывают. Например, вот http://search.cpan.org/~ovid/Sub-Signatures-0.21/lib/Sub/Signatures.pm, один из многих.

Кроме того http://www.effectiveperlprogramming.com/2015/04/use-v5-20-subroutine-signatures/

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от kawaii_neko

А как в хаскелле выглядят именованные параметры?

data Params = Params { City :: String, Date :: IO DateTime }
defaultParams = Params { City :: "Default city", Date :: getCurrentTime}

WeatherRequest (defaultParams { City :: "Spb" })
monk ★★★★★
()
Ответ на: комментарий от cherry-pick

Я использую GHCi как среду для управления роботом. Возникает масса трудностей даже с учётом того, что весь код написан на haskell: я не смог придумать как в самом repl'е задать обработчики unix-сигналов, нет возможности установить дефолтный обработчик всех исключений, есть некоторые трудности .ghci скриптами и много такой мелочи отравляющей существование (кто-нибудь знает как собрать ghci с профилировочными рантаймом?). С другой стороны когда я использовал ghci для основы калькулятора вычисляющего массы молекул и сопутствующие вещи всё было наоборот очень здорово. Так что во многом вопрос в том живут ли все сущности в рамках одной ghci сессии и не жалко ли их протерять.

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