forked from autotelicum/Smooth-CoffeeScript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
10-Modularity.coffee
69 lines (59 loc) · 1.71 KB
/
10-Modularity.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
require './prelude'
# Top level environment
show '--- Top level environment ---'
show global.process.argv[0]
show global.console.log == console.log
show global.global.global.global.global.console
# Pollution
show '--- Pollution ---'
HTML =
tag: (name, content, properties) ->
name: name
properties: properties
content: content
link: (target, text) ->
HTML.tag 'a', [text], {href: target}
# ... many more HTML-producing functions ...
globalize HTML
show link 'http://citeseerx.ist.psu.edu/viewdoc/' +
'download?doi=10.1.1.102.244&rep=rep1&type=pdf',
'What Every Computer Scientist Should Know ' +
'About Floating-Point Arithmetic'
# Unfriendly function
show '--- Unfriendly function ---'
range = (start, end, stepSize, length) ->
if stepSize == undefined
stepSize = 1
if end == undefined
end = start + stepSize * (length - 1)
result = []
while start <= end
result.push start
start += stepSize
result
show range 0, undefined, 4, 5
# Object argument
show '--- Object argument ---'
defaultTo = (object, values) ->
for name, value of values
if not object.hasOwnProperty name
object[name] = value
range = (args) ->
defaultTo args, {start: 0, stepSize: 1}
if args.end == undefined
args.end = args.start +
args.stepSize * (args.length - 1)
result = [];
while args.start <= args.end
result.push args.start
args.start += args.stepSize
result
show range {stepSize: 4, length: 5}
# CoffeeScript eval
show '--- CoffeeScript eval ---'
eval 'function IamJavaScript() {' +
' console.log(\"Repeat after me:' +
' Give me more {();};.\");};' +
' IamJavaScript();'
cs = (require 'coffee-script').CoffeeScript
cs.eval 'show ((a, b) -> a + b) 3, 4'