l e F i z z B u z z d o d e f f i z z _ w o r d ( 0 , 0 , _ ) , d o : " F i z z B u z z " d e f f i z z _ w o r d ( 0 , _ , _ ) , d o : " F i z z " d e f f i z z _ w o r d ( _ , 0 , _ ) , d o : " B u z z " d e f f i z z _ w o r d ( _ , _ , n ) , d o : n d e f f i z z b u z z ( n ) d o f i z z _ w o r d ( r e m ( n , 3 ) , r e m ( n , 5 ) , n ) e n d d e f p r i n t ( n ) d o 1 . . n | > E n u m . m a p ( f n ( n ) - > f i z z b u z z ( n ) e n d ) | > E n u m . j o i n ( " , " ) | > I O . p u t s e n d e n d F i z z B u z z . p r i n t ( 1 0 0 ) Pattern Matching Pipe Operator
just in terms of "Oh, its a functional language", it's actually changed my conception of what it means to program. ~ Dave Thomas “ Taken from: Think Different
Framework] to replace all of my client work and everything I want to build personally ~ Chris McCord “ Taken from: Rise of The Phoenix - Building an Elixir Web Framework
telephony applications to support highly concurrent systems Mature Language/Tools/Community Concurrency (OTP) Distributed (OTP) Fault Tolerant Hot code swapping
random or time libraries (although there are multiple packages). Let's use Erlang's libraries: d e f m o d u l e R a n d o m d o d e f u n i f o r m d o : r a n d o m . u n i f o r m e n d d e f s e e d d o : r a n d o m . s e e d ( : e r l a n g . n o w ) e n d e n d
a t c h ? ( l e f t , r i g h t ) d o q u o t e d o c a s e u n q u o t e ( r i g h t ) d o u n q u o t e ( l e f t ) - > t r u e _ - > f a l s e e n d e n d e n d i e x > l i s t = [ { : a , 1 } , { : b , 2 } , { : a , 3 } ] [ a : 1 , b : 2 , a : 3 ] i e x > E n u m . f i l t e r l i s t , f n ( t h i n g ) - > m a t c h ? ( { : a , _ } , t h i n g ) e n d [ a : 1 , a : 3 ] Taken from: Elixir: It's Not About Syntax
i n s t a l l e l i x i r Programming Elixir – Dave Thomas Distribution/Concurrency Tutorial: elixir-lang.org Exercism.io How I Start. Elixir With José Valim: Portal
u l e M a t h d o d e f s u m _ l i s t ( [ h e a d | t a i l ] , a c c u m u l a t o r ) d o s u m _ l i s t ( t a i l , h e a d + a c c u m u l a t o r ) e n d d e f s u m _ l i s t ( [ ] , a c c u m u l a t o r ) d o a c c u m u l a t o r e n d e n d M a t h . s u m _ l i s t ( [ 1 , 2 , 3 ] , 0 ) # = > 6 Taken from: Elixir Getting Started: Recursion
t h e m o d u l e a n d c r e a t e a p r o c e s s t h a t e v a l u a t e s ` a r e a _ l o o p ` i n t h e s h e l l p i d = s p a w n ( f n - > G e o m e t r y . a r e a _ l o o p ( ) e n d ) # = > # P I D < 0 . 4 0 . 0 > # S e n d a m e s s a g e t o ` p i d ` t h a t w i l l m a t c h a p a t t e r n i n t h e r e c e i v e s t a t e m e n t s e n d p i d , { : r e c t a n g l e , 2 , 3 } # = > A r e a = 6 # { : r e c t a n g l e , 2 , 3 } s e n d p i d , { : c i r c l e , 2 } # = > A r e a = 1 2 . 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 4 9 7 3 8 # { : c i r c l e , 2 } # T h e s h e l l i s a l s o a p r o c e s s , y o u c a n u s e ` s e l f ` t o g e t t h e c u r r e n t p i d s e l f ( ) # = > # P I D < 0 . 2 7 . 0 > Taken from: Learn X in Y Minutes - Elixir
, 2 , 3 ] i e x > b = [ [ 1 , 2 , 3 ] ] i e x > [ c ] = [ [ 1 , 2 , 3 ] ] i e x > a = = c t r u e i e x > [ x , y , z ] = [ 1 , 2 , 3 ] i e x > z 3 i e x > " T o d a y i s " < > d a t e = " T o d a y i s D e c e m b e r 1 6 t h " i e x > d a t e " D e c e m b e r 1 6 t h " d e f m o d u l e M y A p p d o d e f c a l l b a c k ( : o k , d a t a ) d o # s u c c e s s e n d d e f c a l l b a c k ( : e r r o r , d a t a ) d o # h a n d l e f a i l u r e e n d e n d Back To FizzBuzz
when transforming data through a sequence. The operator pipes the result of an expression into the first argument of the next function. Confusing, nested function calls no longer need temporary variables to make them readable: # C o n f u s i n g , n e s t e d f u n c t i o n c a l l s d e f p r i n t ( n ) d o I O . p u t s ( E n u m . j o i n ( E n u m . m a p ( 1 . . n , f n ( n ) - > f i z z b u z z ( n ) e n d ) , " , " ) ) e n d # v e r s u s u s i n g t h e p i p e o p e r a t o r d e f p r i n t ( n ) d o 1 . . n | > E n u m . m a p ( f n ( n ) - > f i z z b u z z ( n ) e n d ) | > E n u m . j o i n ( " , " ) | > I O . p u t s e n d # I n R u b y d e f p r i n t ( n ) p u t s 1 . . n . m a p d o f i z z b u z z ( n ) e n d . j o i n ( " , " ) e n d
a s e s o n e i n v i t e c r e d i t w h e n i t i s w i t h d r a w n ' d o s e n d e r = @ i n v i t e . s e n d e r e x p e c t { @ i n v i t e . w i t h d r a w ; s e n d e r . r e l o a d } . t o c h a n g e { s e n d e r . a v a i l a b l e _ i n v i t e _ c r e d i t s . l e n g t h } . b y ( 1 ) e n d i t ' r e l e a s e s o n e i n v i t e c r e d i t w h e n i t i s w i t h d r a w n ' d o s e n d e r = @ i n v i t e . s e n d e r e x p e c t { @ i n v i t e . w i t h d r a w } . t o c h a n g e { U s e r . a v a i l a b l e _ i n v i t e _ c r e d i t s ( s e n d e r . i d ) . l e n g t h } . b y ( 1 ) e n d
a u t h o r c o u n t s a u t h o r _ c o u n t s = [ ] a u t h o r _ c o u n t s _ i n d e x = - 1 c u r r e n t _ a u t h o r = ' ' f o r i i n 0 . . . c o m m i t s . l e n g t h c o m m i t = c o m m i t s [ i ] i f c o m m i t . a u t h o r = = c u r r e n t _ a u t h o r a u t h o r _ c o u n t s [ a u t h o r _ c o u n t s _ i n d e x ] [ 1 ] + = 1 e l s e c u r r e n t _ a u t h o r = c o m m i t . a u t h o r a u t h o r _ c o u n t s < < [ c o m m i t . a u t h o r , 1 ] a u t h o r _ c o u n t s _ i n d e x + = 1 e n d e n d c o m m i t s . s o r t _ b y d o | c o m m i t | c o m m i t . a u t h o r e n d . c h u n k d o | c o m m i t | c o m m i t . a u t h o r e n d . e a c h d o | a u t h o r , a u t h o r _ c o m m i t s | p u t s " # { a u t h o r } h a s # { a u t h o r _ c o m m i t s . c o u n t } c o m m i t s " e n d
functional style blocks Bottom-up versus Top-down Tell Don't Ask Read POODR by Sandi Metz My approaches to some Ruby problems have probably changed in subtle ways. Learning Elixir has been fun and will help me learn other languages (and their strengths) faster. I'm probably also better prepared to use Proc objects, the Proc#curry method, and Enumerator::Lazy objects but directly practicing them would be even better (perhaps with katas).