Всем привет.
Подскажите пожалуйста как в Common Lisp использовать syscalls (GNU/Linux)? Возможно в CL для этого есть своя библиотека? Я просто хочу поиграться с созданием сокетов и программированием запросов на определенный IP и порт соответственно.
Заранее спасибо
> Подскажите пожалуйста как в Common Lisp использовать syscalls (GNU/Linux)?Ну и да, в самом в общем случае, есть
CFFI.
archimag, большое спасибо! Решил попробовать usocket. Возникло два вопроса.
Первый. На стороне клиента, если соединиться не получилось (например, не верный порт), программа вылетает с ошибкой.
"SSH-2.0-OpenSSH_6.2"
*** - Condition of type USOCKET:CONNECTION-REFUSED-ERROR.Есть ли какой-то способ "мягкого" запроса, т.е. при котором просто можно проверить значение той или иной переменной (например, возвращаемого тем же
usocket:socket-connect) и самому уже обработать... последующее поведение?
(defun simple-test (port string)
(let* ((socket (usocket:socket-connect "127.0.0.1" port))
(stream (usocket:socket-stream socket)))
(write-line string stream)
(force-output stream)
(let ((result (read-line stream)))
(close stream)
(usocket:socket-close socket)
(print result))))
(defun scan (x)
"shows open ports"
(loop for i in x
do (simple-test i "test")))
(scan (list 22 23))
И второй. Как лучше подключать саму библиотеку? Я подключаю сейчас вот таким вот образом, но мне не нравится load. Есть ли более интеллигентный способ?
#!/usr/bin/env clisp
(load "~/quicklisp/setup.lisp")
(ql:quickload "usocket")
p.s. жаль, что в CL нет стандартных средств для этого. Выбирая что-то конктерное, показывая код, всегда придется оговаривать не только каким интерпретатором пользуешься, но и через какую именно библиотеку делал.
> Первый. На стороне клиента, если соединиться не получилось (например, не верный порт), программа вылетает с ошибкой.
"SSH-2.0-OpenSSH_6.2"
*** - Condition of type USOCKET:CONNECTION-REFUSED-ERROR.
Вам система честно сказала, что случилось. И сделала она это с помощью исключения. Хотите мягкого запроса - заворачивайте вызов в
handler-case, например.
> И второй. Как лучше подключать саму библиотеку? Я подключаю сейчас вот
таким вот образом, но мне не нравится load. Есть ли более интеллигентный
способ?
Есть.
Правильно настроить Quicklisp.
> p.s. жаль, что в CL нет стандартных средств для этого.
Зато есть признанные и довольно удобные. См. выше.
> если соединиться не получилось (например, не верный порт), программа вылетает с ошибкой.Она не вылетает с ошибкой, а просто генерирует исключение. А вот если исключение некому обработать, то скорей всего вывалится в отладчик (а может и завершиться, зависит от системы). Читайте
http://lisper.ru/pcl/beyond-exception-handling-conditions-and-restarts.
> жаль, что в CL нет стандартных средств для этого. Выбирая что-то конктерное, показывая код, > всегда придется оговаривать не только каким интерпретатором пользуешься, > но и через какую именно библиотеку делал.
Собственно, в других языках тоже самое.
> Есть.
Правильно настроить Quicklisp.
Не подскажите как это сделать? По ссылке, что Вы привели, предлагают сделать
(ql:add-to-init-file), чтобы загружать Quicklisp автоматически, но это работает только для REPL:
> clisp
i i i i i i i ooooo o ooooooo ooooo ooooo
I I I I I I I 8 8 8 8 8 o 8 8
I \ `+' / I 8 8 8 8 8 8
\ `-+-' / 8 8 8 ooooo 8oooo
`-__|__-' 8 8 8 8 8
| 8 o 8 8 o 8 8
------+------ ooooo 8oooooo ooo8ooo ooooo 8
Welcome to GNU CLISP 2.49 (2010-07-07)
Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010
Type :h and hit Enter for context help.
;; Loading file /home/alex/.clisprc.lisp ...
;; Loading file /home/alex/quicklisp/setup.lisp ...
;; Loaded file /home/alex/quicklisp/setup.lisp
;; Loaded file /home/alex/.clisprc.lisp
[1]> Если же сделать скрипт, т.е. просто указать в первой строке адрес к интерпретатору, то setup.lisp автоматом не загружается...
> Собственно, в других языках тоже самое.
Ну нет. В python, к примеру, есть стандартный модуль socket, и это является официальным способом для работы с сетью. Интерпретатор в python тоже один (ok, один для второй версии и один для третьей).
А смысл делать такие скрипты?
Сдаётся мне - ты один из тех, кто не познал прелести slime, не так ли?
Для оптимизации быстрого старта лучше обойтись без загрузки quicklisp, а перечислить все нужные системы и собрать образ).
Для чуть меньшей оптимизации старта, но более компактного размера сборки в asdf3 что-то придумали с упаковкой в один fasl, я не смотрел, т.к. не мейнстрим.
Мейнстрим это sbcl - я загружался полминуты, компилировал всё добро полчаса, мой аптайм полгода. Как-то так.
Так что REPL наше всё.
> В python
В python говорят, что библиотека, которая попала в стандартную, находится одной ногой в могиле. Но кроме python какой ещё язык обладает подобной стандартной библиотекой?
> чтобы загружать Quicklisp автоматически, но это работает только для REPL:
Ну так сделайте то, что он просит, а потом результат используйте так как вам надо, не?
Первичная настройка Quicklisp добавляет несколько строчек в стартовый файл вашей реализации.
Теоретически, конечно, для РЕПЛа и для запуска без РЕПЛа стартовые файлы могут отличаться, поэтому надо локализовать нужный стартовый файл и правильно его отредактировать.
Но, глядя на ваши вопросы, могу сказать, что тут важнее определиться, нужен вам Quicklisp, или нет.
Если нужен, то читайте его мануалы, если нет, то лучше Quicklisp по частям не подключать, замучаетесь в тонкостях разбираться.
Лучше уж, как коллеги советуют, образ себе сделать и запускать его.
Мне удобнее все же пользоваться Quicklisp (модифицированные библиотеки складываю в local-projects и завожу под git).
> А смысл делать такие скрипты?
Такие скрипты я делаю для bash, perl и python. Этот же метод работает и для CL (clisp и sbcl). Во всех тонкостях CL я еще не разобрался, так что начинаю со знакомых мне методов.
> Сдаётся мне - ты один из тех, кто не познал прелести slime, не так ли?
Да, я еще совсем новичек в CL. Прежде, чем погружаться во все технологии использования, хотелось бы сначала просто попробовать сам язык. Работает по аналогии с другими языками, мне пока этого хватает. Если сам язык зацепит, буду копать дальше.
> В python говорят, что библиотека, которая попала в стандартную,
находится одной ногой в могиле.
Первый раз об этом слышу :)
И что, для того, чтобы, к примеру, прочитать содержимое файла, лучше написать что-то свое, а не использовать
модуль os?
> Но кроме python какой ещё язык обладает
подобной стандартной библиотекой?
Я говорил даже не о стандартной библиотеке, а о
стандартных средствах для, к примеру, создания сетевого соединения.
По поводу другого языка: в C для создания сетевого соединения (на стороне клиента) понадобиться, если не ошибаюсь, 4 вызова:
socket(),
connect(),
read()/
write() и
close() соответственно. Возможно есть какие-то надстройки или библиотеки с дополнительной/специальной функциональностью, но все они так или иначе используют эти вызовы.
> но все они так или иначе используют эти вызовы.Все лисповые вариации тоже используют эти функции. Куда же без них. Собственно, есть CFFI и можно и в лиспе использовать эти же самые функции. Просто есть более удобные варианты. Кстати, в iolib есть готовые низкоуровневые обёртки для большинства базовых системных вызовов.
> И что, для того, чтобы, к примеру, прочитать содержимое файла,> лучше написать что-то свое, а не использовать модуль os?
Я приведу другой пример, можно использовать urllib2, а можно
Requests, или что там стандартной поставке для работы с xml (никогда кажется не использовал), а можно
lxml. Суть в том, что стандартные средства часто настолько кошмарны, что их лучше не использовать, особенно в Python, где на почти на любую тему есть по 3-4 конкурирующих библиотеки высокого качества.
> Я приведу другой пример, можно использовать urllib2, а можно Requests,
> или что там стандартной поставке для работы с xml
> (никогда кажется не использовал), а можно lxml.
Ок, я понял, что Вы мне хотите сказать. Согласитесь, что тут все же одна библиоткека официальная, а остальные - ее заменители. На официальной странице проекта
Requests даже написанно о urllib2 и о причинах создания
Requests.
> Суть в том, что стандартные средства часто настолько кошмарны,
> что их
лучше не использовать, особенно в Python, где на почти на любую
> тему
есть по 3-4 конкурирующих библиотеки высокого качества.
Использовал на работе urllib2, проблем не заметил. Так или иначе, я думаю, лучше каждый останется при своем мнении.
Скажите лучше, что Вы думаете о коде, что я написал? Как его можно улучшить? :)
> Скажите лучше, что Вы думаете о коде, что я написал?
Что можно думать о коде, в котором 15 строк?