Clojure에서 GUI를 수행하는 가장 좋은 방법은 무엇입니까? 일부 매크로를 사용하여

Clojure 에서 GUI를 수행하는 가장 좋은 방법은 무엇입니까 ?

기능적인 Swing 또는 SWT 래퍼 의 예가 있습니까? 또는 일부 매크로를 사용하여 s- 표현식 으로 쉽게 래핑 될 수있는 JavaFX 선언적 GUI 설명 과 일부 통합 됩니까?

튜토리얼이 있습니까?



답변

나는 시소 를 겸손히 제안 할 것이다 .

다음 은 Java 또는 Swing 지식이 없다고 가정 하는 REPL 기반 학습서 입니다.


시소는 @tomjen이 제안한 것과 매우 흡사합니다. “Hello, World”는 다음과 같습니다.

(use 'seesaw.core)

(-> (frame :title "Hello"
       :content "Hello, Seesaw"
       :on-close :exit)
  pack!
  show!)

그리고 여기 @Abhijith와 @dsm의 예가 있습니다.

(ns seesaw-test.core
  (:use seesaw.core))

(defn handler
  [event]
  (alert event
    (str "<html>Hello from <b>Clojure</b>. Button "
      (.getActionCommand event) " clicked.")))

(-> (frame :title "Hello Swing" :on-close :exit
           :content (button :text "Click Me" :listen [:action handler]))
  pack!
  show!)


답변

스튜어트 시에라 (Stuart Sierra)는 최근 clojure (및 스윙)를 사용한 GUI 개발에 관한 일련의 블로그 게시물을 발표했습니다. 여기서 시작하십시오 : http://stuartsierra.com/2010/01/02/first-steps-with-clojure-swing


답변

GUI 프로그래밍을하고 싶다면 온도 변환기 또는 개미 식민지를 가리 킵니다 .

특히 사용자 정의 구성 요소를 만드는 경우 하위 클래스를 통해 Swing의 많은 작업이 수행됩니다. 이를 위해 proxygen-class의 두 가지 필수 함수 / 매크로가 있습니다.

이제 나는 당신이 더 Lispy 방식으로 어디로 가고 있는지 이해합니다. 아직 그런 것이 없다고 생각합니다. 멋진 GUI 빌드 프레임 워크 a-la CLIM을 구축 하지 말 것을 강력히 권유하지만 Lispy를 더 많이 사용하려면 Swing 응용 프로그램 작성을 시작하고 일반적인 패턴을 매크로로 추상화하십시오. 그렇게 할 때, 당신은 일종의 GUI를 작성하는 언어로 끝날 수도 있고, 공유하고 성장할 수있는 매우 일반적인 것들 일 수도 있습니다.

Clojure에서 GUI를 작성할 때 잃어버린 한 가지는 Matisse와 같은 도구를 사용한다는 것입니다. 이것은 Java (GUI)의 일부와 Clojure (논리)의 일부를 작성하는 것을 강력하게 지적 할 수 있습니다. 실제로는 논리에서와 같이 매크로를 사용하여 종류의 논리에 대한 언어를 작성할 수 있으며 GUI보다 더 많은 이점이 있다고 생각합니다. 분명히 응용 프로그램에 따라 다릅니다.


답변

아직 아무도 제안하지 않았으므로 브라우저는 UI 플랫폼입니다. HTTP 서버를 포함하여 Clojure에서 앱을 작성한 다음 HTML에서 딸꾹질 , ClojureScript 및 필요한 수십억 개의 JS 라이브러리에 이르기까지 UI를 사용하여 UI를 개발할 수 있습니다. 일관된 브라우저 동작과 “데스크톱 앱 룩앤필”을 원한다면 크롬을 앱과 번들로 묶을 수 있습니다 .

이 얼마나 될 것으로 보인다 라이트 테이블이 배포됩니다.


답변

페이지에서 :

(import '(javax.swing JFrame JButton JOptionPane)) ;'
(import '(java.awt.event ActionListener))          ;'

(let [frame (JFrame. "Hello Swing")
     button (JButton. "Click Me")]
 (.addActionListener button
   (proxy [ActionListener] []
     (actionPerformed [evt]
       (JOptionPane/showMessageDialog  nil,
          (str "<html>Hello from <b>Clojure</b>. Button "
               (.getActionCommand evt) " clicked.")))))

 (.. frame getContentPane (add button))

 (doto frame
   (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
   .pack
   (.setVisible true)))

print("code sample");

물론 clojure 웹 사이트 의 상호 운용성 섹션을 살펴볼 가치가 있습니다 .


답변

clojure contrib에는 MigLayout에 대한 래퍼가 있습니다. 이 요점을 볼 수도 있습니다 . 나는 기본적으로 스윙 / 마이 그 레이아웃을 배우면서 쓰고있는 코드를 넣습니다.

dsm의 예제는 contrib.swing-utils를 사용하여 lispy 방식으로 다시 작성되었습니다.

(ns test
      (:import (javax.swing JButton JFrame))
      (:use (clojure.contrib
          [swing-utils :only (add-action-listener)])))

    (defn handler
      [event]
      (JOptionPane/showMessageDialog nil,
        (str "<html>Hello from <b>Clojure</b>. Button "
          (.getActionCommand event) " clicked.")))

    (let [ frame (JFrame. "Hello Swing")
           button (JButton. "Click Me")  ]
      (add-action-listener button handler)
        (doto frame
          (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
          (.add button)
          (.pack)
          (.setVisible true)))


답변

메일 링리스트 에서 몇몇 Cells (la Kenny Tilton ‘s Cells ) 구현에 대한 이야기 가있었습니다 . GUI 프로그래밍을하는 아주 깔끔한 방법입니다.