LINUX.ORG.RU

CL or Racket on web

 , ,


1

2

Привет нар..лисперы) для домашнего проекта хочется странного.

Как обстоят дела у Common Lisp и Racket с вебфреймворками? Интересует что-то минималистичное, типа express на NodeJs. Ну и NoSQL БД. Планируется делать только API. SPA как фронт. Заранее спасибо:-)

Ответ на: комментарий от silver-bullet-bfg

Насчёт этого вашего веба подробности на сайтах соответствующих проектов.

anonymous
()

Для Racket смотри http://docs.racket-lang.org/continue/index.html

Минималистично. Блог выглядит так:

; A blog is a (blog posts)
; where posts is a (listof post)
(struct blog (posts) #:mutable)
 
; and post is a (post title body)
; where title is a string, and body is a string
(struct post (title body))
 
; BLOG: blog
; The initial BLOG.
(define BLOG
  (blog
   (list (post "Second Post" "This is another post")
         (post "First Post" "This is my first post"))))
 
; blog-insert-post!: blog post -> void
; Consumes a blog and a post, adds the post at the top of the blog.
(define (blog-insert-post! a-blog a-post)
  (set-blog-posts! a-blog
                   (cons a-post (blog-posts a-blog))))
 
; start: request -> doesn't return
; Consumes a request and produces a page that displays
; all of the web content.
(define (start request)
  (render-blog-page request))
 
; parse-post: bindings -> post
; Extracts a post out of the bindings.
(define (parse-post bindings)
  (post (extract-binding/single 'title bindings)
        (extract-binding/single 'body bindings)))
 
; render-blog-page: request -> doesn't return
; Produces an HTML page of the content of the BLOG.
(define (render-blog-page request)
  (define (response-generator embed/url)
    (response/xexpr
     `(html (head (title "My Blog"))
            (body
             (h1 "My Blog")
             ,(render-posts)
             (form ((action
                     ,(embed/url insert-post-handler)))
                   (input ((name "title")))
                   (input ((name "body")))
                   (input ((type "submit"))))))))
 
  (define (insert-post-handler request)
    (blog-insert-post!
     BLOG (parse-post (request-bindings request)))
    (render-blog-page request))
 
  (send/suspend/dispatch response-generator))
 
; render-post: post -> xexpr
; Consumes a post, produces an xexpr fragment of the post.
(define (render-post a-post)
  `(div ((class "post"))
        ,(post-title a-post)
        (p ,(post-body a-post))))
 
; render-posts: -> xexpr
; Consumes a blog, produces an xexpr fragment
; of all its posts.
(define (render-posts)
  `(div ((class "posts"))
        ,@(map render-post (blog-posts BLOG))))

Обрати внимание, что не требуется никаких сессий, путей и прочего. Просто пишешь (embed/url insert-post-handler) и при переходе по ссылке будет запущена insert-post-handler с доступом ко всем переменным в области видимости (например, BLOG).

NoSQL есть MongoDB.

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

Опять же нечего тут говорить, кроме того, что у Common Lisp довольно хорошая система типов, которая используется далеко не на полную катушку.

ahaha wow

x4DA ★★★★★
()

Компрады, есть еще мнение/советы?

silver-bullet-bfg ★★
() автор топика

Кложура не лисп, но много кто пишет на кложуре веб. Даже книжки про это пишут. Может в эту сторону поглядишь?

slaykovsky ★★★
()
Ответ на: комментарий от silver-bullet-bfg

Да. Есть http://slavsoft.surgut.ru — написан на нём (правда там из динамики одни новости). Есть система учёта заявок и движения материалов. Есть считалка использования трафика для локальной сети.

В минусе автогенерации путей через embed-url только некрасивые адреса. Там есть ручная настройка соответствия путей и аргументов http://docs.racket-lang.org/web-server/dispatch.html, но тогда пропадает автоматическая передача связанных переменных, приходится в глобальных данные записывать.

В плюсе возможность писать веб-приложение как обычное.

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

Я-то ничего не понимаю в вебе. Я просто знаю некоторое количество людей, которые пилят веб на кложуре :)

slaykovsky ★★★
()
Ответ на: комментарий от silver-bullet-bfg

требование одно - NoSQL

А можно полюбопытствовать: чем обусловлено такое требование?

anonymous
()

Clack ещё более минималистичный сервер приложений чем express. Если тебе не играться с минимализмом, а делать сайты, то бери любой из (ЕМНИП) трёх фреймворков поверх Clack. Например уже упомянутый выше Caveman.

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