Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LiveScript @ Front-End Developers Taiwan Party#5
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Chia-liang Kao
February 16, 2014
Technology
1k
8
Share
LiveScript @ Front-End Developers Taiwan Party#5
Chia-liang Kao
February 16, 2014
More Decks by Chia-liang Kao
See All by Chia-liang Kao
Civic Tech as PPP
clkao
0
170
開放政府開了沒?
clkao
0
330
Scaling Civic Tech & Open Source
clkao
0
240
Fork and Merge: Collaboration in Civic Tech
clkao
0
320
Civic Tech & Public Services
clkao
0
160
g0v @ GSDI
clkao
0
320
g0v @ GEO-7
clkao
1
260
g0v @ NYC: Fork & Merge
clkao
0
380
Civic Tech Party
clkao
0
300
Other Decks in Technology
See All in Technology
Agentic Web
dynamis
1
130
データ基盤をDataformで整えた話 〜 開発環境を添えて 〜
takapy
0
110
ルールやカスタム機能、どう使う?理想の出力を引き出すために今知りたいIBM Bob 5つの機能
muehara
1
330
AI駆動開発が変える、大規模開発の前提 ーHuman in the Loop から Human on the Loop へ / AIE2026
visional_engineering_and_design
6
4.5k
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
440
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
110
OCI Oracle AI Database Services新機能アップデート(2026/03-2026/05)
oracle4engineer
PRO
0
220
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
50k
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.7k
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
2.6k
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.5k
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.6k
The agentic SEO stack - context over prompts
schlessera
0
790
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
エンジニアに許された特別な時間の終わり
watany
107
250k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Prompt Engineering for Job Search
mfonobong
0
330
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Thoughts on Productivity
jonyablonski
76
5.2k
Transcript
LiveScript Chia-liang Kao
[email protected]
@clkao Perl Hacker Emacs User Paraglider Pilot
None
New Spine New Life New Project New Language New Editor
None
好⼈人卡 • has Good Parts • was originally called LiveScript
• renamed to JavaScript when Netscape shipped browser with Java support (?!) JavaScript
“What’s the difference between Java and Javascript?”
Java -vs- JavaScript
Language Tax (perl) sub {! my $self = shift;! $self->foo;!
} use method-invoker;! method {! $->foo;! }
Language Tax var x = function(foo) { return foo*foo }!
x(10) # LiveScript x = -> it * it x 10
Language Tax (JavaScript) [1,2,3].map(function(it) { return it * 2 })
Implicit return # LiveScript [1,2,3].map (d) -> d * 2 [1,2,3].map -> it * 2 [1,2,3].map (* 2) Implicit argument shorthand
LiveScript • forked from Coco Feb 2012 • concise syntax
• backcall • comprehension • destructuring • http://livescript.net Go there and try compiling
None
Language Tax $('#element').click(function(){! this.dothis().dothat();! var that = this;! $('.elements').each(function(e){! that.method(e);!
});! }); $('#element').click ->! this.dothis().dothat()! that = this! $('.elements').each (e) ->! that.method e use ->, minimum livescript requirement {} ()
$('#element').click ->! this.dothis().dothat()! $('.elements').each (e) ~>! this.method e $('#element').click ->!
this.dothis().dothat()! that = this! $('.elements').each (e) ->! that.method e bound call, => in coffee script
$('#element').click ->! @dothis().dothat()! $('.elements').each (e) ~>! @method e $('#element').click ->!
this.dothis().dothat()! $('.elements').each (e) ~>! this.method e @ ≡ this
$('#element').click ->! @dothis!.dothat!! $('.elements').each (e) ~>! @method e $('#element').click ->!
@dothis().dothat()! $('.elements').each (e) ~>! @method e func! ≡ func()
$('#element')click ->! @dothis!dothat!! $('.elements')each (e) ~>! @method e $('#element').click ->!
@dothis!.dothat!! $('.elements').each (e) ~>! @method e . after ) ] ! are optional
<- $('#element').click! @dothis!dothat!! $('#element').each (e) ~>! @method e $('#element').click ->!
@dothis!dothat!! $('#element').each (e) ~>! @method e backcall FTW! Backcall
<- $(’#element’).click! @dothis!dothat!! e <~ $(’.elements’).each! @method e <- $(’#element’).click!
@dothis!dothat!! $(’.elements’).each (e) ~>! @method e bound back call too Backcall (cont.)
Language Tax $('#element').click(function(){! this.dothis().dothat();! var that = this;! $('.elements').each(function(e){! that.method(e);!
});! }); LS JS <- $(’#element’).click! @dothis!dothat!! e <~ $(’.elements’).each! @method e
Language Tax $('#element').click(function(){! this.dothis().dothat();! var that = this;! $('.elements').each(function(e){! that.method(e);!
});! }); <- $ ’#element’ .click! @dothis!dothat!! e <~ $ ’.elements’ .each! @method e LS JS optional ()
$('#element').click(function(){! var this$ = this;! this.dothis().dothat();! return $('.elements').each(function(e){! return this$.method(e);!
});! }); <- $('#element').click! @dothis!dothat!! e <~ $('#element').each! @method e % livescript --bare -c
Function Helpers [1,2,3].map(function(it) { return it * 2 }) [1,2,3].map
(* 2) [{k:1},{k.2}].map(function(it) { return it.k }) [1,2,3].map (it) -> it.k [1,2,3].map -> it.k [1,2,3].map (.k) [1,2,3].filter(function(it) { return it > 2}) [1,2,3].filter (it) -> it > 2 [1,2,3].filter (> 2)
Object Helper # some data users = * name: 'clkao'
tags: <[g0v ly livescript]> * name: 'tyler' tags: <[clbc]> * name: 'BoBChao' tags: <[kktix coscup]> List of strings List of objects
Comprehension r = {[key, val * 2] for key, val
of {a: 1, b: 2}}! # r => {a: 2, b: 4}! r = ["#x#y" for x in <[a b]> for y in [1 2]]! # r => ['a1','a2','b1','b2']!
Destructuring [first, second] = [1, 2]! [head, ...tail] = [1
to 5]! {name:name, age:age} = {weight: 110, name: 'emma', age: 20}! ! {name, age} = {weight: 110, name: 'emma', age: 20}! ! {Foo:{name, age}} = {Foo: {weight: 110, ! name: 'emma', age: 20}}! !
Destructuring (cont.) # assignment! a = {foo: bar, baz: baz,
woot: [a1, a2] }! a = {foo: bar, baz, woot: [a1, a2] }! ! # vs! ! { foo: bar, baz: baz, woot: [a1, a2] } = a! { foo: bar, baz, woot: [a1, a2] } = a! { foo: bar, baz, woot: [a1, a2] }:res = foo!
Many more x = 10! do ->! x = 5!
x #=> 10! ! do ->! x := 2! x #=> 2! a = [2 7 1 8]! ..push 3! ..shift!! ..sort!! a #=> [1,3,7,8]!
Too new a language? • new languages are no longer
big deals • compiles to JavaScript, still readable • and (sort of) back, js2coffee • ambiguity? sugar that makes sense • language stability? 1.2.0 released!
Questions?
Thank You!