> 1 <

Автор Сообщение

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3007   2010-09-25 19:09 GMT+3 часа(ов)      
Нашел http://axiom-wiki.newsynthesis.org/SandBoxSocketsInSPAD
*****************************
A Simple Lisp Web Server

For our current purposes we can define a simple interface based on some code originally provided by Camm Maguire's simple http server in lisp

lisp

;; file: http-test.lisp
(defun bar (p fn)
(let ((s (si::socket p :server fn)))
(tagbody l
(when (si::listen s)
(let ((w (si::accept s)))
(foo w)))
(sleep 3)
(go l))))

(defun foo (s)
(let* ((get (read s nil 'eof))
(fn (and (eq get 'get) (string-downcase (read s nil 'eof))))
)
(format t "Got ~S~%~%" fn)
(let ((fn (when (probe-file fn) fn) )))
(format s "HTTP/1.1 ~S~%~%" (if fn 200 403))
(format t "HTTP/1.1 ~S~%~%" (if fn 200 403))
(when fn
(if (pathname-name (pathname fn))
(with-open-file (q fn) (si::copy-stream q s))
(dolist (l (directory fn)) (format s "~a~%" (namestring l)))))
(close s)))

+ lisp

; compiling file "/var/zope2/var/LatexWiki/304369446719046572-25px001.lisp" (written 20 SEP 2010 04:50:49 PM):
; compilation aborted after 0:00:00.030

>> System error:
The value NIL
is not of type
(OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING PATHNAME STREAM).

To start the HTTP server on port 8085 we call:

>(bar 8085 #'foo)

or in Axiom we can use the commands:

)lisp (load "http-test.lisp")
)lisp (bar 8085 #'foo)

then access with the url:

http://localhost:8085/directory/or/file
***********************************************

Оно вроде работает, но браузер молчит, пытаясь получить страницу. По таймауту не отваливается (я долго ждал).
Пример встречается ещё на паре сайтов, с мелкими изменениями.

Пожалуйста, подскажите как в браузере получить хоть что-нибудь.

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#3009   2010-09-25 20:38 GMT+3 часа(ов)      
Оно повисло ненайдя файла.
Дальше учиться дебажить и трейсить (благо С REPL это не сложно) иначе смысла в запуске таких кусков ни на грошь.

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3035   2010-09-30 22:26 GMT+3 часа(ов)      
to: antares0
раздел вроде - "Lisp - с чего начать?".
и насколько я понял до поиска файлов не доходит.
А посылать в гугл и отладчик - это да, конструктивно...

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3038   2010-10-01 01:49 GMT+3 часа(ов)      
>раздел вроде - "Lisp - с чего начать?".
antares0 прав) А начинать нужно не с этого)

>и насколько я понял до поиска файлов не доходит.
Это Вы наглаз определили?)

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#3044   2010-10-01 23:06 GMT+3 часа(ов)      
Цитата
SmallPlushBear :
to: antares0
раздел вроде - "Lisp - с чего начать?".
и насколько я понял до поиска файлов не доходит.
А посылать в гугл и отладчик - это да, конструктивно...


! В гугл я не посылал, отладчик на ше все. Хотя бы REPL осильте.
А что конструктивно? Сделать все за вас?
 
>> System error:
The value NIL
is not of type (OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING PATHNAME STREAM).
 

Вот тут вылет в отладчик, с сообщением, что вместо имени файла получен nil.

step и [url=http://www.lispworks.com/documentation/HyperSpec/Body/m_tracec.htm[/url]trace[/url]

P. S. Внезапно, а какую точно строку вы в браузер загнали? Надеюсь не
http://localhost:8085/directory/or/file

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3053   2010-10-03 09:22 GMT+3 часа(ов)      
to Misha:
Это Вы наглаз определили?)

Не-а. Старым-старым методом. Напихал ему вывод в консоль. И видно где-чего, и лог заодно.
Правда переменные типа "поток" это да. Но их REPL'ом непонятно как рассматривать.

to Antares0:
P. S. Внезапно, а какую точно строку вы в браузер загнали? Надеюсь не
http://localhost:8085/directory/or/file

Ну не настолько все печально.

А nil по имени файла, да, будет. Я ж не могу синхронизировать запрос от браузера с началом выполнения (bar).
И при первом проходе !обязательно имени файла нет. А дальше как нажмешь.


Тут похоже все работает, как заявлено автором.
Вникал в первоисточник - там обещали "доступ по url", а не "работу с браузером".
Axiom ихний, в режиме он-же сервер он-же клиент, по get запросу должен че-то выдавать.
А браузеру похоже, урезанный http протокол (а он именно протокол "запрос-ответ"), не входит.
Нарыл в итоге HttpDotLisp "http.lisp" - одним маленьким исходником - вроде работает. Частями.
Но http вроде реализует - дождался вопроса - отдал ответ - все по взрослому.
Соответственно исходник в N раз больше. И 1999 года - в коментах "А с более новыми версиями CLisp местами не работает"
;;; This code has been tested with the 1999-07-22 version of CLisp.
;;; It will probably not run under earlier versions. (This code
;;; depends on several functions that had bugs in earlier versions.)
+OPENMCL - тоже поддерживаемая когда-то версия лиспа - он теперь Clozure Common Lisp
+MCL - и искать не стал

Сижу дружу его с нынешним SBCL'ем. Только он какой-то, более другой.
Может что и получиться.

А с REPL'ом у меня трудности, да. Но по завету Ильича, продолжаем.
Печатного мануала в кириллице, на Common Lisp не сыскал.
PCL - это конечно да, переводчикам памятник надо ставить. Но книга слишком популярная.

Спасибо.

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#3054   2010-10-03 21:32 GMT+3 часа(ов)      
Если для обучения, то есть смысл, наделать своего. Попутно лстая описание http. Так толку будет ИМХО больше.

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3055   2010-10-03 23:11 GMT+3 часа(ов)      
Оно и есть. Хотелось только маленький рабочий пример подержать. Ну я же верю, что оно работает...

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3056   2010-10-04 00:56 GMT+3 часа(ов)      
>Оно и есть. Хотелось только маленький рабочий пример подержать.
Если Вы не привязаны к CL, то я могу для Вас на писать несколько тестовых серверов на Racket.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3057   2010-10-04 01:03 GMT+3 часа(ов)      
Если интересно, то можете протестировать мой FTP-сервер(RFTPd).

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#3058   2010-10-04 13:38 GMT+3 часа(ов)      
ClikiГоворит что есть еще s-http-server. У меня он даже заработал.
Но с другой стороны если уж нужен рабочий пример то лучше уж сразу hunchentoot.

отредактировал(а) antares0: 2010-10-04 13:43 GMT+3 часа(ов)

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3059   2010-10-04 15:53 GMT+3 часа(ов)      
А hunchentoot кэширует скомпилированные скрипты?

archimag

Members


Статус

48 сообщений

Где: Russia
Род занятий:
Возраст:

#3060   2010-10-04 16:16 GMT+3 часа(ов)      
Цитата
misha :
А hunchentoot кэширует скомпилированные скрипты?



misha, извини, не выдержал, но ты спросил что-то очень, очень глупое ))

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3061   2010-10-04 16:22 GMT+3 часа(ов)      
>misha, извини, не выдержал, но ты спросил что-то очень, очень глупое

Racket http server именно так и поступает. Я, собственно, не пойму в чем проблема?

archimag

Members


Статус

48 сообщений

Где: Russia
Род занятий:
Возраст:

#3062   2010-10-04 16:28 GMT+3 часа(ов)      
> Racket http server именно так и поступает.

Верю, только это же Scheme, а это CL. В CL весь код загружается в образ, который работает постоянно. В том числе, в него загружается и код Hunchentoot. И Hunchentoot не работает с какими-либо "скриптами в файлах", он работает с функциями, которые есть в образе. За компиляцию кода отвечает реализация CL (тот же SBCL компилирует в машинный код), но никак не веб-сервер. Понятие "кэширование скомпилированных скриптов" абсолютно бессмысленно. Какая-либо аналогия с Apache+PHP совершенно не уместна.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3063   2010-10-04 16:51 GMT+3 часа(ов)      
С этого и надо было начинать) В Racket понятие файл(скрипт) эквивалентно понятию модуль, возможность загружать скрипт с помощью load обычно не применяется в реальных программах(считается устаревшей возможностью). Модуль можно скомпилировать как в память, так и в файл. Хотя эта возможность предоставляется, но до сих пор рекомендуется оставить этот процесс на усмотрение реализации.

archimag

Members


Статус

48 сообщений

Где: Russia
Род занятий:
Возраст:

#3064   2010-10-04 17:03 GMT+3 часа(ов)      
В CL разделение кода на файлы используется исключительно для удобства и никак не влияет на свойства образа. Код компилируется в машинный и становится частью образа. Вот я и говорю: то, что имеет смысл в Racket, совершенно бессмысленно в CL.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3065   2010-10-04 17:46 GMT+3 часа(ов)      
>Вот я и говорю: то, что имеет смысл в Racket, совершенно бессмысленно в CL.

Я думаю, это не совсем так. Когда клиент запрашивает содержимое страницы по адресу http://www.test.com/test.rkt, то Racket http server сначала проверяет существует ли данный модуль "htdocs/test.rkt"(его скомпилированный образ) в кэше, и если есть, то он выполняет его главный метод. Иначе он его компилирует -> кэширует -> выполняет.

А как обстоят дела в hunchentoot?

archimag

Members


Статус

48 сообщений

Где: Russia
Род занятий:
Возраст:

#3067   2010-10-04 18:11 GMT+3 часа(ов)      
Ну, какая-то очень древняя система маршрутизации в Racket, я думал новые разработки так уже никто не делает. Hunchentoot не предоставляет какой-либо особой системы маршрутизации, но никак и не мешает использовать произвольные. Я использую вот это: http://restas.lisper.ru/manual/routes.html

LinkFly

Members


Статус

152 сообщений

Где: Russia
Род занятий:
Возраст:

#3068   2010-10-04 18:28 GMT+3 часа(ов)      
Ещё бы, ведь грех не использовать свою собственную разработку ;))

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3069   2010-10-04 20:03 GMT+3 часа(ов)      
>какая-то очень древняя система маршрутизации в Racket

Ну, так это по умолчанию) Racket HTTP Server - это фреймворк для создания веб-серверов. Для перезаписи URL необходимо добавить собственный обработчик(dispatcher).

kreol

Members


Статус

87 сообщений

Где: Ukraine Днепропетровск
Род занятий: студент
Возраст: 26

#3070   2010-10-05 01:36 GMT+3 часа(ов)      
misha, а на рекете для вебсервера пользоваться (require web-server/servlet
web-server/servlet-env)??

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3072   2010-10-05 09:13 GMT+3 часа(ов)      
to Misha:
>Если Вы не привязаны к CL, то я могу для Вас на писать несколько тестовых серверов на Racket.
Привязан к CL под лицензией BSD, "в стандартной поставке", без сторонних библиотек.
Прожект мелкобюджетный, работа оплачивается вся, инструменты нет. Видимо будет SBCL.
Тестовых на Ракете, не надо, спасибо.
FTP сервер видел. Работает. Ракет гуд, но мне мимо кассы.

to Antares0:
> ClikiГоворит что есть еще s-http-server. У меня он даже заработал.
Видел, но уже сломался на >"наделать своего. Попутно лстая описание http".
Сижу наделываю.
Исходник просмотрел. Для меня те-же проблемы - старый пример с новой реализацией CL.
Обычно, в примерах socket'ы берутся из черте чего.
Например пакет PORT устарел, видно, морально - для GCL - коммент на open-server-socket ;FIXME много назад.
Мелочи работающей на SBCL, CLisp, GCL нынешних редакций так и не нашел.
> Но с другой стороны если уж нужен рабочий пример то лучше уж сразу hunchentoot.
hunchentoot размер "примера" перерос немного + его чудные зависимости.
Пример искал не "покажите мне работающий сервер на лиспе", а "изобразить сервер на экран кода в лиспе".

Стандарт CommonLisp, как таковой, не читал, но складывается ощущение что socket'ы и иже с ним в него не входят.
Уж сильно разные реализации от лиспа к лиспу. Суть, понятно, одна, имена, вызовы и упаковка - гордо самостийные.
Курим SBCL'manual.

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#3073   2010-10-05 13:31 GMT+3 часа(ов)      
Цитата
Обычно, в примерах socket'ы берутся из черте чего. Например пакет PORT устарел, видно, морально - для GCL - коммент на open-server-socket ;FIXME много назад.
Мелочи работающей на SBCL, CLisp, GCL нынешних редакций так и не нашел.


GCL практически вышел из употребления. Путем шаманизма и ритуалов вуду вызывается его дух для сборки максимы и axiom.
Сеть не в стандарте, да. Но есть например usocket. Если уж надо совсем без библиотек, то выдрать из него нужную последовательность вызова.
На один экран это уж скорее к J

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3075   2010-10-05 17:15 GMT+3 часа(ов)      
> На один экран это уж скорее к J - Не понял. что имелось в виду.

Usocket для переносимости софта между (ABCL, Allegro, clisp, CMUCL, LispWorks, OpenMCL, SBCL, ECL and SCL).
MIT лицензия гуд, но мне оно просто не к чему.
Можно ограничиться SBCL - вроде минимально-достаточно все есть.

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#3080   2010-10-05 23:49 GMT+3 часа(ов)      
Цитата
SmallPlushBear :
> На один экран это уж скорее к J - Не понял. что имелось в виду.


Юмор, возможно неудачный.
[url]en.wikipedia.org/wiki/J_(programming_language)[/url] - язык с ОЧЕНЬ сжатым синтаксисом.
В среде J бытует что-то вроде поговорки, что любая система вне завивисимоти erp это или web-сервер должна умещатьсяв один экран кода.

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#3092   2010-10-07 02:13 GMT+3 часа(ов)      
)

SmallPlushBear

Members


Статус

8 сообщений

Где: Russia
Род занятий:
Возраст:

#7821   2018-01-09 06:01 GMT+3 часа(ов)      
Некропост. Возникла нужда в примере и... я нашел эту ветку Верну часть долга сообществу.

Пример:
простого http-ответчика
sbcl thread
sbcl socket

Пример не lisp-style, императив с волшебными числами. Но так понятнее начинающим.

SBCL "из коробки", без зависимостей, Linux/Windows, ARM версию (RasbPI) не проверял
сохранить в файл, в REPL - (load "имяфайла")
в браузере - localhost:8888

 
(defparameter *http-on* 10)
 
(defun wos ()
(let ((s (make-instance 'sb-bsd-sockets:inet-socket :type :stream :protocol :tcp)))
(setf (sb-bsd-sockets:non-blocking-mode s) t)
(setf (sb-bsd-sockets:sockopt-reuse-address s) t)
(sb-bsd-sockets:socket-bind s (sb-bsd-sockets:make-inet-address "127.0.0.1") 8888)
(sb-bsd-sockets:socket-listen s 5)
s))
(defun wcs (s)
(sb-bsd-sockets:socket-close s))
 
(defparameter *S* (wos))
(defparameter sleeptime 0.001)
 
(defparameter st (sb-thread:make-thread
(lambda ()
 
(loop while (= *http-on* 10) do
(let ((s (sb-bsd-sockets:socket-accept *s*)))
(if (null s) (let () (sleep sleeptime) (if (< sleeptime 0.1) (setq sleeptime (+ 0.001 sleeptime))) )
(let ((str (sb-bsd-sockets:socket-make-stream s :output t :input t :element-type 'character :buffering :none :auto-close t :serve-events t)))
(let ((req (loop while (listen str) collect (read-line str) )))
(format t "~{~a~}" req)
(format t "serve /~%")
(force-output)
(format str "HTTP/1.1 200 OK~%Content-type: text/html~%~%")
(format str "Simple http server<br>")
(format str "sleeptime was: ~d~%<br>" sleeptime)
(format str "~{~a~^<br>~}<br>" req)
(format str "Type (setf *http-on* 0) in REPL to stop server thread")
(close str)
(setq sleeptime 0)
)))))
(wcs *S*)
(write-line "http stopped"))))
 
> 1 <


Онлайн :

0 пользователь(ей), 20 гость(ей) :




Реклама на сайте: