SlideShare a Scribd company logo
1 of 44
Clojureand Swing – a new productivity sweet spot? Simon White
Skills Matter The UK Open Source Training Company Training on: Agile Development, Test Driven Development, Java, Eclipse, Spring, Hibernate, Ajax, Ruby on Rails, Struts Ti, Wicket, JavaServer Faces, Tapestry, Beehive, AOP, RIFE and more! Training straight from the Source Experts write and teach our courses: Adrian Colyer, Chad Fowler, Howard M. Lewis Ship Craig Larman, Dave Crane, Kevlin Henney, Rob Harrop, Kito Mann, Rod Johnson and many more Partners with leading edge companies BEA, IBM, Interface21, Sun, Tangosol, wso2 © Catalysoft Ltd, 2010
Speaker Qualifications Simon White, IndependentJava developer Games published 1985 PhD Artificial Intelligence Written Scientific Software for: Remote Sensing Drug Discovery Medical & Genetics Research Swing Developer since 2000 Author of JIDE Charts SkillsMatter Author & Trainer © Catalysoft Ltd, 2010
What is Clojure? A functional language that runs on the JVM A new dialect of LISP Not Closure Not Clozure MYTH: LISP is slow MYTH: Therefore Clojure is slow
Functional Languages What is a function? a mathematical relation such that each element of a given set (the domain of the function) is associated with an element of another set (the range of the function)) [Wordnet] Focus on the input/output relation e.g. length of a string maps a string to an integer Immutability Good; Side-effects Bad
LISP Syntax (functor param1 param2 ... paramn) for example, (+ 1 2) Brackets denote evaluation A single quote protects from evaluation so '(x y z) does not use x as a function With nested expressions, evaluate inner expression first: (+ (+ 2 3) (* 2 3)) is 11 Special forms like let, cond deviate from the syntax and must be learned
Hello Factorial n! = n × (n-1) × (n-2) × ... × 1 Also 0! = 1 (defnfac  “Computes the factorial of n”    [n]    (if (= n 0)        1        (* n (fac (- n 1)))))
REPLRead-Evaluate-Print-Loop user=> (defn add-one [n] (+ 1 n)) #'user/add-one user=> (add-one 6) 7 user=>
Java vs. LISP
Why mix Java and LISP? To get the best of both: Speedy development of custom code in LISP Speedy development through library reuse in Java Speedy development of applications with concurrent processing
LISP Promotes Agility LISP was agile long before agility was respected  Easy to mix and match function application Accommodate changing requirements Many small functions => very reusable code REPL Encourages ad-hoc testing Functional style makes it easy to write unit tests
Clojureas a LISP dialect Simplified syntax compared to Common LISP cond, let Not object-oriented But you can define structures and multi-methods No multiple value returns Arguably syntactic sugar anyway Lazy evaluation of sequences Destructuring Structural pattern matching on function parameters Concurrency
Data Structures 1: Lists (list 'a 'b 'c) -> (a b c) (first '(a b c)) -> a (rest '(a b c)) -> (b c) (nth '(a b c) 1) -> b (cons 'a '(b c)) -> (a b c) (concat '(a b) '(c d)) -> (a b c d)
Data Structures 2: Vectors (vector 'a 'b 'c) -> [a b c] (first '[a b c]) -> a (rest '[a b c]) -> (b c) (nth '[a b c] 1) -> b (cons 'a '[b c]) -> (a b c) (conj '[a b] 'c) -> [a b c] (concat '[a b] '[c d]) -> (a b c d)
Data Structures 3: Maps Key-Value Pairs (get '{a 1, b 2} 'b) -> 2 (assoc '{a 1, b 2} 'c 3) -> {c 3, a 1, b 2} (dissoc '{a 1, b 2} 'b) -> {a 1} (defstruct book :title :author) (struct-map book :title "Jungle Book" :author "Rudyard Kipling")  (bean obj)
Everything is a Sequence Lists, Vectors and Maps are all sequences first, rest & cons always return a sequence (range 5) -> (0 1 2 3 4) (take 2 (range 5)) -> (0 1) (take 3 (repeat 'x)) -> (x xx)
Predicates (Boolean-Valued Tests) (= a 10) (identical? a b) (even? a) (odd? a) (integer? a)
Decisions (if (= a 1) 5 0) (cond      (= a 1) 5       (= a 2) 10      true 0) (when (= a 1) 5) a == 1 ? 5 : 0 Java
"Iteration" (for [a '(1 2 3)] (+ a 1)) -> (2 3 4) (doseq [a (range 5)] a) -> nil (doseq [a (range 3)] (println a)) -> 0 1 2 nil
Anonymous Functions user=> (fn [a b] (+ a b 1)) #<user$eval__101$fn__103 ...@a613f8> user=> ((fn [a b] (+ a b 1)) 3 4) 8 user=> #(+ %1 %2) #<user$eval__121$fn__123 ...@56f631>
Higher Order Functions (inc 1)->2 (map inc '(1 2 3))->(2 3 4) (map + '(1 2 3) '(10 11 12))->(11 13 15) (max 1 2 3)->3 (apply max '(1 2 3))->3 (filter even? (range 10))->(0 2 4 6 8)
Partial Functions Partial returns a function user=> (def add-two (partial + 2)) #'user/add-two user=> (add-two 5) 7
Java Interoperability
A GUI in a functional language? Functional languages use functions as mathematical models of computation: f(x1, x2, ...) -> x’ Great for factorials, but how does it work with user-interfaces? Forms? Keyboard & Mouse? Events?
Need to Think Differently Values of functions ‘computed’ as the result of a user-interaction Consider y-or-n-p CL> (y-or-n-p "Do you really want to quit?") T
Modelling Change of State f(x) -> x’ Name: “George” DOB: “11-Jul-73” Address: “16 Goldman Square” Name: “George” DOB: “11-Jul-73” Address: “3 Elm Avenue” This is a new (immutable) value, not a modified one
Java Swing: Create a JFrame import javax.swing.JFrame; public class MyClass { ...   public static void main(String[] args) { JFrame frame = new JFrame("My Frame"); frame.setBounds(300, 300, 600, 400); frame.setVisible(true);   } }
Clojure Swing: Create a JFrame (ns user   (:import (javax.swingJFrame))) (defn make-frame []   (let [f (JFrame. "My Frame")]     (.setBounds f 300 300 600 400)     (.setVisible f true)     f     )   ) f is the return value
Alternative: Use doto (defn make-frame []   (let [f (JFrame. "My Frame")]    (doto f       (.setBounds 300 300 600 400)       (.setVisible true))))
Create a Panel & Button (ns user   (:import java.awt.FlowLayout     (javax.swingJButtonJPanel))) (defn make-panel []   (let [panel (JPanel. (FlowLayout.))         button (JButton. "Press Me")]     (doto panel       (.add button))))
Make a Button do Something (defn make-panel2 []   (let [panel (JPanel. (FlowLayout.))         button (JButton. "Press Me")]     (.addActionListener button       (proxy [ActionListener] []         (actionPerformed [e] (println e))))     (doto panel       (.add button))     )   ) #<ActionEventjava.awt.event.ActionEvent[ACTION_PERFORMED,cmd=Press Me...
Clojure Custom Component (defn make-component [msg]   (proxy [javax.swing.JComponent] []     (paintComponent [g]       (let [height (.getHeight this)             width (.getWidth this)]         (doto g            ...            ))))) Detail on next slide
Custom Component (cont/d) (doto g   (.setColorColor/gray)   (.fillOval 20 20 (- width 20) (- height 20))   (.setColorColor/yellow)   (.fillOval 0 0 (- width 20) (- height 20))   (.setFont (.deriveFont (.getFont g) (float 50)))   (.setColorColor/black)   (.drawStringmsg (int (/ (- width (.stringWidth (.getFontMetrics g) msg)) 2))      (int (/ height 2))))
Three ways in which Clojure can help Swing Reducing boiler-plate code Easy to write code that generates the required patterns Definitions of actions and easier binding Easier to separate configuration (name, icon, keyboard shortcut, ...) from code hook Flexibility and Reusability Using functions as parameters for user customisation of behaviour
1. Reducing Boiler-Plate Code GridBagConstraints c = new GridBagConstraints(); c.weighty = 1.0; c.weightx = 1.0; c.insets = new Insets(5, 5, 5, 5); c.gridx = 0; c.gridy = 0; c.gridheight = 2; c.anchor = GridBagConstraints.CENTER; c.fill = GridBagConstraints.BOTH;         add(leftListPane, c); c.gridx = 1; c.gridy = 0; c.gridheight = 1;         ... ,[object Object]
Use the same options a lot of the time
Difficult to understand,[object Object]
2. Defining Swing Actions Swing Actions are a nice idea, but have problems.  Typically, you might have: Lots of inner classes with repeated boiler plate code, or: Separate classes that extend AbstractAction but are too tightly coupled to a main class so that they have the necessary context for the actionPerformed() method.
Clojure Actions: Defer binding for actionPerformed method With an Action in Clojure it’s possible to preset the ‘constant’ variables like Name, Icon, Accelerator ; but defer the binding for the handler. This means we can easily separate the creation of an action according to some template from its binding to a response function.
Create an Action when the handler function is known (defmacro copy-action [handler]  `(make-action    {:name "Copy"     :command-key "copy"     :icon (ImageIcon. (fetch-image "copy.png"))     :handler ~handler     :mnemonic (mnemonic )     :accelerator (accelerator "ctrl C")}))
3. Flexibility and Reusability (def *tracing-actions* true)   (defntrace-action [handler]   (fn [#^ActionEvent e]     (try       (when *tracing-actions*  (print "Doing" (.getActionCommand e)))       (handler e)       (finally         (when *tracing-actions* (println "Done"))))))
Swing Worker & Busy Cursor (defmacro with-busy-cursor   [component f]   `(proxy [SwingWorker] []     (doInBackground []         (.setCursor ~component (Cursor/getPredefinedCursor Cursor/WAIT_CURSOR))       ~f)     (done []         (.setCursor ~component (Cursor/getDefaultCursor))))) (with-busy-cursor chart  (load-file data-file))
Clojure/Swing in the Real World
Creating a Chart Model (defn make-model   "Create and return a ChartModel using the supplied rows and picking out the x and y columns"   [model-name rows #^String x-col #^String y-col]   (let [model (DefaultChartModel. model-name)]     (doseq [row rows]       (let [x (get row x-col)             y (get row y-col)]         (when (and (number? x) (number? y))           (.addPoint model (double x) (double y))))       )     model))

More Related Content

What's hot

Code as data as code.
Code as data as code.Code as data as code.
Code as data as code.
Mike Fogus
 
Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good code
Giordano Scalzo
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
Giordano Scalzo
 
awesome groovy
awesome groovyawesome groovy
awesome groovy
Paul King
 
Advanced python
Advanced pythonAdvanced python
Advanced python
EU Edge
 

What's hot (20)

The Macronomicon
The MacronomiconThe Macronomicon
The Macronomicon
 
Naïveté vs. Experience
Naïveté vs. ExperienceNaïveté vs. Experience
Naïveté vs. Experience
 
core.logic introduction
core.logic introductioncore.logic introduction
core.logic introduction
 
Code as data as code.
Code as data as code.Code as data as code.
Code as data as code.
 
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
Scala traits training by Sanjeev Kumar @Kick Start Scala traits & Play, organ...
 
Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good code
 
JavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java DevelopersJavaOne 2013 - Clojure for Java Developers
JavaOne 2013 - Clojure for Java Developers
 
The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84The Ring programming language version 1.2 book - Part 79 of 84
The Ring programming language version 1.2 book - Part 79 of 84
 
Clojure Intro
Clojure IntroClojure Intro
Clojure Intro
 
Polyglot Grails
Polyglot GrailsPolyglot Grails
Polyglot Grails
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy
 
From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019From Java to Parellel Clojure - Clojure South 2019
From Java to Parellel Clojure - Clojure South 2019
 
Groovy intro for OUDL
Groovy intro for OUDLGroovy intro for OUDL
Groovy intro for OUDL
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
 
awesome groovy
awesome groovyawesome groovy
awesome groovy
 
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
JDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation streamJDays Lviv 2014:  Java8 vs Scala:  Difference points & innovation stream
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
 
Clean Code Development
Clean Code DevelopmentClean Code Development
Clean Code Development
 
Advanced python
Advanced pythonAdvanced python
Advanced python
 
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
Model-Driven Software Development - Pretty-Printing, Editor Services, Term Re...
 

Similar to Clojure And Swing

JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
David Padbury
 
Clojure - A new Lisp
Clojure - A new LispClojure - A new Lisp
Clojure - A new Lisp
elliando dias
 
Polyglot Programming @ Jax.de 2010
Polyglot Programming @ Jax.de 2010Polyglot Programming @ Jax.de 2010
Polyglot Programming @ Jax.de 2010
Andres Almiray
 

Similar to Clojure And Swing (20)

Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Groovy
GroovyGroovy
Groovy
 
Exploring Clojurescript
Exploring ClojurescriptExploring Clojurescript
Exploring Clojurescript
 
Go 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX GoGo 1.10 Release Party - PDX Go
Go 1.10 Release Party - PDX Go
 
Clojure - A new Lisp
Clojure - A new LispClojure - A new Lisp
Clojure - A new Lisp
 
Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007Groovy Update - JavaPolis 2007
Groovy Update - JavaPolis 2007
 
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative LanguagesJavaFX Your Way: Building JavaFX Applications with Alternative Languages
JavaFX Your Way: Building JavaFX Applications with Alternative Languages
 
Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John Stevenson
 
Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from Oredev
 
Eric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build systemEric Lafortune - The Jack and Jill build system
Eric Lafortune - The Jack and Jill build system
 
Getting started with Clojure
Getting started with ClojureGetting started with Clojure
Getting started with Clojure
 
Pune Clojure Course Outline
Pune Clojure Course OutlinePune Clojure Course Outline
Pune Clojure Course Outline
 
Practical REPL-driven Development with Clojure
Practical REPL-driven Development with ClojurePractical REPL-driven Development with Clojure
Practical REPL-driven Development with Clojure
 
Jet presentation
Jet presentationJet presentation
Jet presentation
 
Polyglot Programming @ Jax.de 2010
Polyglot Programming @ Jax.de 2010Polyglot Programming @ Jax.de 2010
Polyglot Programming @ Jax.de 2010
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
Scala @ TechMeetup Edinburgh
Scala @ TechMeetup EdinburghScala @ TechMeetup Edinburgh
Scala @ TechMeetup Edinburgh
 
Clojure 1.1 And Beyond
Clojure 1.1 And BeyondClojure 1.1 And Beyond
Clojure 1.1 And Beyond
 

More from Skills Matter

Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
Skills Matter
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
Skills Matter
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
Skills Matter
 

More from Skills Matter (20)

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
 
Serendipity-neo4j
Serendipity-neo4jSerendipity-neo4j
Serendipity-neo4j
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Plug 20110217
Plug   20110217Plug   20110217
Plug 20110217
 
Lug presentation
Lug presentationLug presentation
Lug presentation
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
 
Plug saiku
Plug   saikuPlug   saiku
Plug saiku
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Clojure And Swing

  • 1. Clojureand Swing – a new productivity sweet spot? Simon White
  • 2. Skills Matter The UK Open Source Training Company Training on: Agile Development, Test Driven Development, Java, Eclipse, Spring, Hibernate, Ajax, Ruby on Rails, Struts Ti, Wicket, JavaServer Faces, Tapestry, Beehive, AOP, RIFE and more! Training straight from the Source Experts write and teach our courses: Adrian Colyer, Chad Fowler, Howard M. Lewis Ship Craig Larman, Dave Crane, Kevlin Henney, Rob Harrop, Kito Mann, Rod Johnson and many more Partners with leading edge companies BEA, IBM, Interface21, Sun, Tangosol, wso2 © Catalysoft Ltd, 2010
  • 3. Speaker Qualifications Simon White, IndependentJava developer Games published 1985 PhD Artificial Intelligence Written Scientific Software for: Remote Sensing Drug Discovery Medical & Genetics Research Swing Developer since 2000 Author of JIDE Charts SkillsMatter Author & Trainer © Catalysoft Ltd, 2010
  • 4. What is Clojure? A functional language that runs on the JVM A new dialect of LISP Not Closure Not Clozure MYTH: LISP is slow MYTH: Therefore Clojure is slow
  • 5. Functional Languages What is a function? a mathematical relation such that each element of a given set (the domain of the function) is associated with an element of another set (the range of the function)) [Wordnet] Focus on the input/output relation e.g. length of a string maps a string to an integer Immutability Good; Side-effects Bad
  • 6. LISP Syntax (functor param1 param2 ... paramn) for example, (+ 1 2) Brackets denote evaluation A single quote protects from evaluation so '(x y z) does not use x as a function With nested expressions, evaluate inner expression first: (+ (+ 2 3) (* 2 3)) is 11 Special forms like let, cond deviate from the syntax and must be learned
  • 7. Hello Factorial n! = n × (n-1) × (n-2) × ... × 1 Also 0! = 1 (defnfac “Computes the factorial of n” [n] (if (= n 0) 1 (* n (fac (- n 1)))))
  • 8. REPLRead-Evaluate-Print-Loop user=> (defn add-one [n] (+ 1 n)) #'user/add-one user=> (add-one 6) 7 user=>
  • 10. Why mix Java and LISP? To get the best of both: Speedy development of custom code in LISP Speedy development through library reuse in Java Speedy development of applications with concurrent processing
  • 11. LISP Promotes Agility LISP was agile long before agility was respected Easy to mix and match function application Accommodate changing requirements Many small functions => very reusable code REPL Encourages ad-hoc testing Functional style makes it easy to write unit tests
  • 12. Clojureas a LISP dialect Simplified syntax compared to Common LISP cond, let Not object-oriented But you can define structures and multi-methods No multiple value returns Arguably syntactic sugar anyway Lazy evaluation of sequences Destructuring Structural pattern matching on function parameters Concurrency
  • 13. Data Structures 1: Lists (list 'a 'b 'c) -> (a b c) (first '(a b c)) -> a (rest '(a b c)) -> (b c) (nth '(a b c) 1) -> b (cons 'a '(b c)) -> (a b c) (concat '(a b) '(c d)) -> (a b c d)
  • 14. Data Structures 2: Vectors (vector 'a 'b 'c) -> [a b c] (first '[a b c]) -> a (rest '[a b c]) -> (b c) (nth '[a b c] 1) -> b (cons 'a '[b c]) -> (a b c) (conj '[a b] 'c) -> [a b c] (concat '[a b] '[c d]) -> (a b c d)
  • 15. Data Structures 3: Maps Key-Value Pairs (get '{a 1, b 2} 'b) -> 2 (assoc '{a 1, b 2} 'c 3) -> {c 3, a 1, b 2} (dissoc '{a 1, b 2} 'b) -> {a 1} (defstruct book :title :author) (struct-map book :title "Jungle Book" :author "Rudyard Kipling") (bean obj)
  • 16. Everything is a Sequence Lists, Vectors and Maps are all sequences first, rest & cons always return a sequence (range 5) -> (0 1 2 3 4) (take 2 (range 5)) -> (0 1) (take 3 (repeat 'x)) -> (x xx)
  • 17. Predicates (Boolean-Valued Tests) (= a 10) (identical? a b) (even? a) (odd? a) (integer? a)
  • 18. Decisions (if (= a 1) 5 0) (cond (= a 1) 5 (= a 2) 10 true 0) (when (= a 1) 5) a == 1 ? 5 : 0 Java
  • 19. "Iteration" (for [a '(1 2 3)] (+ a 1)) -> (2 3 4) (doseq [a (range 5)] a) -> nil (doseq [a (range 3)] (println a)) -> 0 1 2 nil
  • 20. Anonymous Functions user=> (fn [a b] (+ a b 1)) #<user$eval__101$fn__103 ...@a613f8> user=> ((fn [a b] (+ a b 1)) 3 4) 8 user=> #(+ %1 %2) #<user$eval__121$fn__123 ...@56f631>
  • 21. Higher Order Functions (inc 1)->2 (map inc '(1 2 3))->(2 3 4) (map + '(1 2 3) '(10 11 12))->(11 13 15) (max 1 2 3)->3 (apply max '(1 2 3))->3 (filter even? (range 10))->(0 2 4 6 8)
  • 22. Partial Functions Partial returns a function user=> (def add-two (partial + 2)) #'user/add-two user=> (add-two 5) 7
  • 24. A GUI in a functional language? Functional languages use functions as mathematical models of computation: f(x1, x2, ...) -> x’ Great for factorials, but how does it work with user-interfaces? Forms? Keyboard & Mouse? Events?
  • 25. Need to Think Differently Values of functions ‘computed’ as the result of a user-interaction Consider y-or-n-p CL> (y-or-n-p "Do you really want to quit?") T
  • 26. Modelling Change of State f(x) -> x’ Name: “George” DOB: “11-Jul-73” Address: “16 Goldman Square” Name: “George” DOB: “11-Jul-73” Address: “3 Elm Avenue” This is a new (immutable) value, not a modified one
  • 27. Java Swing: Create a JFrame import javax.swing.JFrame; public class MyClass { ... public static void main(String[] args) { JFrame frame = new JFrame("My Frame"); frame.setBounds(300, 300, 600, 400); frame.setVisible(true); } }
  • 28. Clojure Swing: Create a JFrame (ns user (:import (javax.swingJFrame))) (defn make-frame [] (let [f (JFrame. "My Frame")] (.setBounds f 300 300 600 400) (.setVisible f true) f ) ) f is the return value
  • 29. Alternative: Use doto (defn make-frame [] (let [f (JFrame. "My Frame")] (doto f (.setBounds 300 300 600 400) (.setVisible true))))
  • 30. Create a Panel & Button (ns user (:import java.awt.FlowLayout (javax.swingJButtonJPanel))) (defn make-panel [] (let [panel (JPanel. (FlowLayout.)) button (JButton. "Press Me")] (doto panel (.add button))))
  • 31. Make a Button do Something (defn make-panel2 [] (let [panel (JPanel. (FlowLayout.)) button (JButton. "Press Me")] (.addActionListener button (proxy [ActionListener] [] (actionPerformed [e] (println e)))) (doto panel (.add button)) ) ) #<ActionEventjava.awt.event.ActionEvent[ACTION_PERFORMED,cmd=Press Me...
  • 32. Clojure Custom Component (defn make-component [msg] (proxy [javax.swing.JComponent] [] (paintComponent [g] (let [height (.getHeight this) width (.getWidth this)] (doto g ... ))))) Detail on next slide
  • 33. Custom Component (cont/d) (doto g (.setColorColor/gray) (.fillOval 20 20 (- width 20) (- height 20)) (.setColorColor/yellow) (.fillOval 0 0 (- width 20) (- height 20)) (.setFont (.deriveFont (.getFont g) (float 50))) (.setColorColor/black) (.drawStringmsg (int (/ (- width (.stringWidth (.getFontMetrics g) msg)) 2)) (int (/ height 2))))
  • 34. Three ways in which Clojure can help Swing Reducing boiler-plate code Easy to write code that generates the required patterns Definitions of actions and easier binding Easier to separate configuration (name, icon, keyboard shortcut, ...) from code hook Flexibility and Reusability Using functions as parameters for user customisation of behaviour
  • 35.
  • 36. Use the same options a lot of the time
  • 37.
  • 38. 2. Defining Swing Actions Swing Actions are a nice idea, but have problems. Typically, you might have: Lots of inner classes with repeated boiler plate code, or: Separate classes that extend AbstractAction but are too tightly coupled to a main class so that they have the necessary context for the actionPerformed() method.
  • 39. Clojure Actions: Defer binding for actionPerformed method With an Action in Clojure it’s possible to preset the ‘constant’ variables like Name, Icon, Accelerator ; but defer the binding for the handler. This means we can easily separate the creation of an action according to some template from its binding to a response function.
  • 40. Create an Action when the handler function is known (defmacro copy-action [handler] `(make-action {:name "Copy" :command-key "copy" :icon (ImageIcon. (fetch-image "copy.png")) :handler ~handler :mnemonic (mnemonic ) :accelerator (accelerator "ctrl C")}))
  • 41. 3. Flexibility and Reusability (def *tracing-actions* true)   (defntrace-action [handler]   (fn [#^ActionEvent e]     (try       (when *tracing-actions* (print "Doing" (.getActionCommand e)))       (handler e)       (finally         (when *tracing-actions* (println "Done"))))))
  • 42. Swing Worker & Busy Cursor (defmacro with-busy-cursor [component f] `(proxy [SwingWorker] [] (doInBackground [] (.setCursor ~component (Cursor/getPredefinedCursor Cursor/WAIT_CURSOR)) ~f) (done [] (.setCursor ~component (Cursor/getDefaultCursor))))) (with-busy-cursor chart (load-file data-file))
  • 43. Clojure/Swing in the Real World
  • 44. Creating a Chart Model (defn make-model "Create and return a ChartModel using the supplied rows and picking out the x and y columns" [model-name rows #^String x-col #^String y-col] (let [model (DefaultChartModel. model-name)] (doseq [row rows] (let [x (get row x-col) y (get row y-col)] (when (and (number? x) (number? y)) (.addPoint model (double x) (double y)))) ) model))
  • 45. Summary Clojureis Powerful and Flexible Excellent Java Interoperability Opportunities to apply LISP power to Swing GUI development Can be used for Real World Applications A Secret Weapon for Productivity?
  • 46. Closure Example (defnplusn [x] (fn [y] (+ x y))) (def plus5 (plusn 5)) (plus5 3) >> 8

Editor's Notes

  1. A closure is a feature provided by some languages that capture the lexical context in which a code fragment was written. The free variables in that lexical context are ‘closed over’ so the code fragment can be passed around and used elsewhere.Clozure is a dialect of LISP for the Mac (formerly Macintosh Common LISP)
  2. defn defines a function
  3. You can also create GUI elements such as JFrames and JButtons on the fly.
  4. There are only few libraries in LISP compared to Java because it is a niche language.However, the fact that it is a niche language could make it your secret weapon.
  5. For is actually a list comprehension
  6. Reasons for using partial functions: Binding parameters at different times (when they become known) Clearer semantics
  7. ns specifies the name space for the functions that followlet allows you to define some local variables
  8. ns specifies the name space for the functions that followlet allows you to define some local variables
  9. Or if you create a new GridBagConstraints object often, you might not remember what all the constructor arguments are
  10. The example with-busy-cursor is intended as an illustration only