SlideShare a Scribd company logo
Func%onal	Programming	
	In	Prac%ce	
Michiel	Borkent		
@borkdude	
Hogeschool	Utrecht	
May	9th	2016
Agenda	
●  Func>onal	Programming	
●  Haskell,	Scala,	Clojure	
●  Full	stack	example	using	Clojure
First,	what	is	FP?	
•  First	class	func>ons	
•  Pure	func>ons	
•  Immutable	values	
•  No	or	few	side	effects
First	class	func%ons	
Func>ons	can	be	created	on	the	fly	
	
scala>	val	f	=	(x:	String)	=>	"Hello	"	+	x	
f:	String	=>	String	=	<function1>	
	
scala>	f("World")	
res10:	String	=	Hello	World
First	class	func%ons	
Func>ons	can	be	passed	around	as	values	
	
List("Clojure","Scala","Haskell").map(f)	
res:	List(Hello	Clojure,	Hello	Scala,	Hello	Haskell)
Pure	func%ons	
Func>on	with	same	input	always	yields	the	output:	
	
f(x)	==	y,	always
Not	a	pure	func%on	
scala>	val	f	=	(i:	Int)	=>	Math.random()	*	i	
f:	Int	=>	Double	=	<function1>	
	
scala>	f(1)	
res14:	Double	=	0.13536266885499726	
	
scala>	f(1)	
res15:	Double	=	0.4086671423543593
A	pure	func%on?	
val	add	=	(x:	Int,	y:	Int)	=>	x	+	y	
add(1,2)	//	3
A	pure	func%on?	
class	MutableInt(var	i:	Int)	{		
		override	def	toString	=	i.toString		
}	
	
val	add	=	(x:	MutableInt,	y:	MutableInt):	MutableInt	=>		
		new	MutableInt(x.i	+	y.i)	
	
val	x	=	new	MutableInt(1)	
val	y	=	new	MutableInt(2)		
	
add(x,y)	//	MutableInt	=	3
A	pure	func%on?	No!	
You	cannot	build	pure	func>ons	with	mutable	objects.	
	
add(x,y)	//	MutableInt	=	3	
	
x.i	=	2	
	
add(x,y)	//	MutableInt	=	4	
	
	
add(x,y)	does	not	always	yield	the	same	result!	
This	is	why	we	need	immutable	values	in	Func>onal	Programming.
A	pure	func%on?	
List(1,2,3)	is	immutable.	
	
def	addZero(l:	List[Int])	=	0	::	l	
	
addZero(List(1,2,3))	//	List(0,	1,	2,	3)
Immutable	data	structures	
Int,	String,	etc	are	already	immutable	
	
0	::	List(1,2,3)			//	List(0,1,2,3)	
Vector(1,2,3)	:+	4	//	Vector(1,2,3,4)	
Set(1,2,3)	+	4					//	Set(1,2,3,4)	
	
Efficient	by	re-using	structure	internally
source:	hVp://hypirion.com/musings/understanding-persistent-vector-pt-1
Systems	and	immutability	
•  Each	system	receives	a	message	
and/or	sends	a	message	
•  Muta>ng	a	message	does	not	
affect	other	system	
•  In	tradi>onal	OO	references	lead	
to	uncontrolled	muta>on,	also	
called	spooky	ac>on	at	a	distance	
•  You	can	protect	yourself	by	
using	Value	Objects	or	DTOs,	
but	takes	work	
•  Immutable	data	structures	
solve	this	problem
•  State	modifica>on	
•  Observable	ac>on	
	
Examples:	
•  Modifying	a	variable	
•  Wri>ng	to	a	file	
Side	effects
•  Pure	func>ons	have	no	side	effects	
•  Side	effects	are	difficult	to	test	(without	mocks)	
•  Pure	FP	languages	make	side	effects	explicit	
•  FP	languages	isolate/minimize	side	effects	
Side	effects
Where	are	the	side	effects?	
class	Program	extends	App	{	
		var	x:	Int	=	1	
		def	mutateX	=	{	
				x	=	(Math.random	*	100).toInt	
		}	
		mutateX	
		println(x)	
}
Where	are	the	side	effects?	
class	Program	extends	App	{	
		var	x:	Int	=	1	
		def	mutateX	=	{	
				x	=	(Math.random	*	100).toInt	
		}	
		mutateX	
		println(x)	
}
Why	Func%onal	Programming?	
•  Makes	codes	easier	to	reason	about	
•  Easier	to	test	
•  More	expressive,	less	code	=	less	bugs	
•  BeVer	suited	for	parallellisa>on	and	concurrency
Examples	in	Haskell,	Scala	and	Clojure	
•  Define	a	new	type	Person	
•  Create	a	list	of	Persons	
•  Count	total	length	of	first	names	with	length	
greater	than	4	
	
hVps://github.com/borkdude/fp-hu-may-2016/blob/master/code
Degrees	of	FP	
Nirvana
Unsafe Safe
Useless
Useful C#, Java
Haskell
Scala
Clojure
SQL, Linq
Simon Peyton Jones, FP researcher
Learning	FP	
Choose	a	language	that	encourages	FP	
	
	
	
	
	
Apply	the	concepts	in	your	favorite	language	
‘Think	like	a	fundamentalist,	code	like	a	hacker’	–	Erik	Meijer	
Haskell Pure, lazy,
statically typed
Clojure Not pure. FP + Lisp on JVM,
dynamically typed
Scala Not pure. FP + (immutable) OO on
JVM, statically typed
Haskell	resources
Clojure	resources	
http://michielborkent.nl/clojurecursus
Scala	resources	
Functional Programming in Scala Coursera MOOC
Developers	love	FP	
Source: http://stackoverflow.com/research/developer-survey-2016
Companies	want	FP	devs	
Source: http://stackoverflow.com/research/developer-survey-2016
Once	you	know	FP	
…	you	can	apply	and	see	it	everywhere
FP	at	my	job	
•  Microservices	in	Scala	
•  UI	in	JavaScript	using	React,	ImmutableJS	and	
Redux
Functional Programming In Practice
Clojure	
•  dynamic	language	
•  Lisp	
•  func>onal	programming	
•  immutable	data	structures	
•  strong	concurrency	support	
•  embraces	host	plajorm	(JVM,	js)	
•  EDN
Clojure	in	industry	
hVps://www.youtube.com/watch?v=av9Xi6CNqq4	
	
	
http://dev.clojure.org/display/community/Clojure+Success+Stories
https://www.youtube.com/watch?v=iUC7noGU1mQ
Data	literals	
Keyword:				:a	
Vector:					[1	2	3	4]	
Hash	map:			{:a	1,	:b	2}	
Set:								#{1	2	3	4}	
List:							'(1	2	3	4)
Extensible	Data	Nota%on	
{:key1"Bar"	
	:key2	[1	2	3]	
	"key3",	#{1.0	2.0	c}	
	:key4,{:foo	{:bar	{:baz	'hello}}}}		
	
(pr-str	{:foo	"bar"})	
(read-string	"{:foo	"bar"}")
f(x)	->	(f	x)	
	
Syntax
Syntax	
if	(...)	{	
		...	
}	else	{							->	
		...		
}	
	
(if	...	
				...	
				...)
Syntax	
var	foo	=	"bar";		
	
(def	foo	"bar")
JavaScript	-	ClojureScript	
if	(bugs.length	>	0)	{	
		return	'Not	ready	for	release';	
}	else	{	
		return	'Ready	for	release';	
}	
	
(if	(pos?	(count	bugs))	
		"Not	ready	for	release"	
		"Ready	for	release")	
source:	hVp://himera.herokuapp.com/synonym.html
JavaScript	-	ClojureScript	
var	foo	=	{bar:	"baz"};	
foo.bar	=	"baz";	
foo["abc"]	=	17;	
	
alert('foo')	
new	Date().getTime()	
new	
Date().getTime().toString()	
	
	
(def	foo	(js-obj	"bar"	"baz"))	
(set!	(.-bar	foo)	"baz")	
(aset	foo	"abc"	17)	
	
(js/alert	"foo")	
(.getTime	(js/Date.))	
(..	(js/Date.)	(getTime)	
(toString))	
source:	hVp://himera.herokuapp.com/synonym.html
Persistent	data	structures	
(def	v	[1	2	3])	
(conj	v	4)	;;	=>	[1	2	3	4]	
(get	v	0)	;;	=>	1	
(v	0)	;;	=>	1
Persistent	data	structures	
(def	m	{:foo	1	:bar	2})	
(assoc	m	:foo	2)	;;	=>	{:foo	2	:bar	2}	
(get	m	:foo)	;;=>	1	
(m	:foo)	;;=>	1	
(:foo	m)	;;=>	1	
(dissoc	m	:foo)	;;=>	{:bar	2}
Func%onal	programming	
(def	r	(->>		
									(range	10)				;;	(0	1	2	..	9)	
									(filter	odd?)	;;	(1	3	5	7	9)	
									(map	inc)))			;;	(2	4	6	8	10)		
;;	r	is	(2	4	6	8	10)
Func%onal	programming	
;;	r	is	(2	4	6	8	10)	
(reduce	+	r)		
;;	=>	30	
(reductions	+	r)	
;;	=>	(2	6	12	20	30)	
	
	
	
var	sum	=	_.reduce(r,	function(memo,	num){	return	memo	+	num;	});
Sequence	abstrac%on	
Data	structures	as	seqs	
(first	[1	2	3])	;;=>	1	
(rest	[1	2	3])	;;=>	(2	3)	
General	seq	func>ons:	map,	reduce,	filter,	...	
(distinct	[1	1	2	3])	;;=>	(1	2	3)	
(take	2	(range	10))	;;=>	(0	1)	
	
See	hVp://clojure.org/cheatsheet	for	more
Sequence	abstrac%on	
Most	seq	func>ons	return	lazy	sequences:	
	
(take	2	(map		
										(fn	[n]	(js/alert	n)	n)		
												(range)))	
	 infinite	lazy	sequence	of	numbers	
side	effect
Mutable	state:	atoms	
(def	my-atom	(atom	0))	
@my-atom	;;	0	
(reset!	my-atom	1)	
(reset!	my-atom	(inc	@my-atom))	;;	bad	idiom	
(swap!	my-atom	(fn	[old-value]	
																		(inc	old-value)))	
(swap!	my-atom	inc)	;;	same	
@my-atom	;;	4
Lisp:	macros	
(map	inc		
		(filter	odd?		
				(range	10)))	
	
(->>		
		(range	10)	
		(filter	odd?)	
		(map	inc))	
thread	last	macro
Lisp:	macros	
(macroexpand		
		'(->>	(range	10)	(filter	odd?)))	
	
;;	=>	(filter	odd?	(range	10))	
	
(macroexpand		
		'(->>	(range	10)	(filter	odd?)	(map	inc)))	
	
;;	=>	(map	inc	(filter	odd?	(range	10)))
Lisp:	macros	
JVM	Clojure:	
	
(defmacro	defonce	[x	init]	
	`(when-not	(exists?	~x)	
				(def	~x	~init)))	
	
	
ClojureScript:	
	
(defonce	foo	1)	
(defonce	foo	2)	;;	no	effect	
notes:		
●  macros	must	be	wriVen	in	JVM	Clojure	
●  are	expanded	at	compile	>me	
●  generated	code	gets	executes	in	ClojureScript
Ar%kel	in	Java	Magazine	over	Clojure	
hVp://michielborkent.nl/nljug/18_21_Clojure.pdf
Demo	%me!	
https://github.com/borkdude/fp-hu-may-2016
Ad

More Related Content

What's hot (20)

A Brief Intro to Scala
A Brief Intro to ScalaA Brief Intro to Scala
A Brief Intro to Scala
Tim Underwood
 
Programming in Scala: Notes
Programming in Scala: NotesProgramming in Scala: Notes
Programming in Scala: Notes
Roberto Casadei
 
The Evolution of Scala
The Evolution of ScalaThe Evolution of Scala
The Evolution of Scala
Martin Odersky
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentation
Martin Odersky
 
Scala in a nutshell by venkat
Scala in a nutshell by venkatScala in a nutshell by venkat
Scala in a nutshell by venkat
Venkateswaran Kandasamy
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
Rahul Jain
 
Martin Odersky - Evolution of Scala
Martin Odersky - Evolution of ScalaMartin Odersky - Evolution of Scala
Martin Odersky - Evolution of Scala
Scala Italy
 
20160520 what youneedtoknowaboutlambdas
20160520 what youneedtoknowaboutlambdas20160520 what youneedtoknowaboutlambdas
20160520 what youneedtoknowaboutlambdas
shinolajla
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
Mohammad Hossein Rimaz
 
Scalax
ScalaxScalax
Scalax
Martin Odersky
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
Jonas Bonér
 
Procedure Typing for Scala
Procedure Typing for ScalaProcedure Typing for Scala
Procedure Typing for Scala
akuklev
 
Aggregate Programming in Scala
Aggregate Programming in ScalaAggregate Programming in Scala
Aggregate Programming in Scala
Roberto Casadei
 
Scala eXchange opening
Scala eXchange openingScala eXchange opening
Scala eXchange opening
Martin Odersky
 
Scala test
Scala testScala test
Scala test
Inphina Technologies
 
Joy of scala
Joy of scalaJoy of scala
Joy of scala
Maxim Novak
 
Programming with Lambda Expressions in Java
Programming with Lambda Expressions in Java Programming with Lambda Expressions in Java
Programming with Lambda Expressions in Java
langer4711
 
Metaprogramming in Scala 2.10, Eugene Burmako,
Metaprogramming  in Scala 2.10, Eugene Burmako, Metaprogramming  in Scala 2.10, Eugene Burmako,
Metaprogramming in Scala 2.10, Eugene Burmako,
Vasil Remeniuk
 
Oscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simpleOscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simple
Martin Odersky
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
Saleem Ansari
 
A Brief Intro to Scala
A Brief Intro to ScalaA Brief Intro to Scala
A Brief Intro to Scala
Tim Underwood
 
Programming in Scala: Notes
Programming in Scala: NotesProgramming in Scala: Notes
Programming in Scala: Notes
Roberto Casadei
 
The Evolution of Scala
The Evolution of ScalaThe Evolution of Scala
The Evolution of Scala
Martin Odersky
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentation
Martin Odersky
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
Rahul Jain
 
Martin Odersky - Evolution of Scala
Martin Odersky - Evolution of ScalaMartin Odersky - Evolution of Scala
Martin Odersky - Evolution of Scala
Scala Italy
 
20160520 what youneedtoknowaboutlambdas
20160520 what youneedtoknowaboutlambdas20160520 what youneedtoknowaboutlambdas
20160520 what youneedtoknowaboutlambdas
shinolajla
 
Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)Pragmatic Real-World Scala (short version)
Pragmatic Real-World Scala (short version)
Jonas Bonér
 
Procedure Typing for Scala
Procedure Typing for ScalaProcedure Typing for Scala
Procedure Typing for Scala
akuklev
 
Aggregate Programming in Scala
Aggregate Programming in ScalaAggregate Programming in Scala
Aggregate Programming in Scala
Roberto Casadei
 
Scala eXchange opening
Scala eXchange openingScala eXchange opening
Scala eXchange opening
Martin Odersky
 
Programming with Lambda Expressions in Java
Programming with Lambda Expressions in Java Programming with Lambda Expressions in Java
Programming with Lambda Expressions in Java
langer4711
 
Metaprogramming in Scala 2.10, Eugene Burmako,
Metaprogramming  in Scala 2.10, Eugene Burmako, Metaprogramming  in Scala 2.10, Eugene Burmako,
Metaprogramming in Scala 2.10, Eugene Burmako,
Vasil Remeniuk
 
Oscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simpleOscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simple
Martin Odersky
 
Introduction to Scala
Introduction to ScalaIntroduction to Scala
Introduction to Scala
Saleem Ansari
 

Similar to Functional Programming In Practice (20)

Scala ntnu
Scala ntnuScala ntnu
Scala ntnu
Alf Kristian Støyle
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
Abbas Raza
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Pavlo Baron
 
2014 holden - databricks umd scala crash course
2014   holden - databricks umd scala crash course2014   holden - databricks umd scala crash course
2014 holden - databricks umd scala crash course
Holden Karau
 
Functional Programming - Past, Present and Future
Functional Programming - Past, Present and FutureFunctional Programming - Past, Present and Future
Functional Programming - Past, Present and Future
Pushkar Kulkarni
 
Functional Programming Past Present Future
Functional Programming Past Present FutureFunctional Programming Past Present Future
Functional Programming Past Present Future
IndicThreads
 
The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202
Mahmoud Samir Fayed
 
Intro to Functional Programming
Intro to Functional ProgrammingIntro to Functional Programming
Intro to Functional Programming
Andraž Bajt
 
Scala fundamentals
Scala fundamentalsScala fundamentals
Scala fundamentals
Alfonso Ruzafa
 
Real World Haskell: Lecture 1
Real World Haskell: Lecture 1Real World Haskell: Lecture 1
Real World Haskell: Lecture 1
Bryan O'Sullivan
 
Introductiontoprogramminginscala
IntroductiontoprogramminginscalaIntroductiontoprogramminginscala
Introductiontoprogramminginscala
Amuhinda Hungai
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian DragosScala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereld
Werner Hofstra
 
Principles of functional progrmming in scala
Principles of functional progrmming in scalaPrinciples of functional progrmming in scala
Principles of functional progrmming in scala
ehsoon
 
Introduction to Asynchronous scala
Introduction to Asynchronous scalaIntroduction to Asynchronous scala
Introduction to Asynchronous scala
Stratio
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risks
SeniorDevOnly
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
Tomasz Wrobel
 
Scala for curious
Scala for curiousScala for curious
Scala for curious
Tim (dev-tim) Zadorozhniy
 
ECMAScript 2015
ECMAScript 2015ECMAScript 2015
ECMAScript 2015
Sebastian Pederiva
 
Knolx Session : Built-In Control Structures in Scala
Knolx Session : Built-In Control Structures in ScalaKnolx Session : Built-In Control Structures in Scala
Knolx Session : Built-In Control Structures in Scala
Ayush Mishra
 
Introduction to clojure
Introduction to clojureIntroduction to clojure
Introduction to clojure
Abbas Raza
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
Pavlo Baron
 
2014 holden - databricks umd scala crash course
2014   holden - databricks umd scala crash course2014   holden - databricks umd scala crash course
2014 holden - databricks umd scala crash course
Holden Karau
 
Functional Programming - Past, Present and Future
Functional Programming - Past, Present and FutureFunctional Programming - Past, Present and Future
Functional Programming - Past, Present and Future
Pushkar Kulkarni
 
Functional Programming Past Present Future
Functional Programming Past Present FutureFunctional Programming Past Present Future
Functional Programming Past Present Future
IndicThreads
 
The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202
Mahmoud Samir Fayed
 
Intro to Functional Programming
Intro to Functional ProgrammingIntro to Functional Programming
Intro to Functional Programming
Andraž Bajt
 
Real World Haskell: Lecture 1
Real World Haskell: Lecture 1Real World Haskell: Lecture 1
Real World Haskell: Lecture 1
Bryan O'Sullivan
 
Introductiontoprogramminginscala
IntroductiontoprogramminginscalaIntroductiontoprogramminginscala
Introductiontoprogramminginscala
Amuhinda Hungai
 
Scala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian DragosScala: Object-Oriented Meets Functional, by Iulian Dragos
Scala: Object-Oriented Meets Functional, by Iulian Dragos
3Pillar Global
 
Scala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereldScala: Functioneel programmeren in een object georiënteerde wereld
Scala: Functioneel programmeren in een object georiënteerde wereld
Werner Hofstra
 
Principles of functional progrmming in scala
Principles of functional progrmming in scalaPrinciples of functional progrmming in scala
Principles of functional progrmming in scala
ehsoon
 
Introduction to Asynchronous scala
Introduction to Asynchronous scalaIntroduction to Asynchronous scala
Introduction to Asynchronous scala
Stratio
 
From Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risksFrom Java to Scala - advantages and possible risks
From Java to Scala - advantages and possible risks
SeniorDevOnly
 
(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?(How) can we benefit from adopting scala?
(How) can we benefit from adopting scala?
Tomasz Wrobel
 
Knolx Session : Built-In Control Structures in Scala
Knolx Session : Built-In Control Structures in ScalaKnolx Session : Built-In Control Structures in Scala
Knolx Session : Built-In Control Structures in Scala
Ayush Mishra
 
Ad

More from Michiel Borkent (6)

re-find: fun with spec
re-find: fun with specre-find: fun with spec
re-find: fun with spec
Michiel Borkent
 
ClojureScript interfaces to React
ClojureScript interfaces to ReactClojureScript interfaces to React
ClojureScript interfaces to React
Michiel Borkent
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
Michiel Borkent
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015
Michiel Borkent
 
Full Stack Clojure
Full Stack ClojureFull Stack Clojure
Full Stack Clojure
Michiel Borkent
 
Waarom plantaardig(er)?
Waarom plantaardig(er)?Waarom plantaardig(er)?
Waarom plantaardig(er)?
Michiel Borkent
 
ClojureScript interfaces to React
ClojureScript interfaces to ReactClojureScript interfaces to React
ClojureScript interfaces to React
Michiel Borkent
 
ClojureScript for the web
ClojureScript for the webClojureScript for the web
ClojureScript for the web
Michiel Borkent
 
ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015ClojureScript loves React, DomCode May 26 2015
ClojureScript loves React, DomCode May 26 2015
Michiel Borkent
 
Ad

Recently uploaded (20)

Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)
Ortus Solutions, Corp
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptxSpecial Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
shyamraj55
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Cybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure ADCybersecurity Identity and Access Solutions using Azure AD
Cybersecurity Identity and Access Solutions using Azure AD
VICTOR MAESTRE RAMIREZ
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)Into The Box Conference Keynote Day 1 (ITB2025)
Into The Box Conference Keynote Day 1 (ITB2025)
Ortus Solutions, Corp
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptxSpecial Meetup Edition - TDX Bengaluru Meetup #52.pptx
Special Meetup Edition - TDX Bengaluru Meetup #52.pptx
shyamraj55
 
Quantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur MorganQuantum Computing Quick Research Guide by Arthur Morgan
Quantum Computing Quick Research Guide by Arthur Morgan
Arthur Morgan
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Linux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdfLinux Professional Institute LPIC-1 Exam.pdf
Linux Professional Institute LPIC-1 Exam.pdf
RHCSA Guru
 

Functional Programming In Practice