Created
August 20, 2019 16:12
-
-
Save agoose77/d51e99528e63d0442b119ab12bc2a246 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# General introduction" | |
]a | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Definitions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>6</code>" | |
], | |
"text/plain": [ | |
"6" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Add 2 to 4\n", | |
"(+ 2 4)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>4</code>" | |
], | |
"text/plain": [ | |
"4" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define x 4)\n", | |
"x" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>16</code>" | |
], | |
"text/plain": [ | |
"16" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define (squared x) (* x x))\n", | |
"(squared 4)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>14</code>" | |
], | |
"text/plain": [ | |
"14" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Let is effectively an expression statement e.g x:=5 binds x to 5 & returns x\n", | |
";; (let ([id expr] [id expr] ...) body-expr)\n", | |
"(let ([x 5] [y 9]) (+ x y))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>14</code>" | |
], | |
"text/plain": [ | |
"14" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; let* can bind to identifiers earlier in the (list?) of expressions\n", | |
";; Here, x=5, y=x+4, return x+y\n", | |
"(let* ([x 5] [y (+ x 4)]) (+ x y))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>16</code>" | |
], | |
"text/plain": [ | |
"16" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Lambdas are anonymous functions, and the functional define syntax is shorthand for a named lambda\n", | |
"(define squared (lambda (x) (* x x)))\n", | |
"(squared 4)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(1 2 3 4)</code>" | |
], | |
"text/plain": [ | |
"'(1 2 3 4)" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; List of numbers\n", | |
"(define data (list 1 2 3 4))\n", | |
"data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(1 4 9 16)</code>" | |
], | |
"text/plain": [ | |
"'(1 4 9 16)" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Compute the squares\n", | |
"(map squared data)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>3</code>" | |
], | |
"text/plain": [ | |
"3" | |
] | |
}, | |
"execution_count": 29, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define (add a b) (+ a b))\n", | |
"(apply add (list 1 2))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>3</code>" | |
], | |
"text/plain": [ | |
"3" | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Use ` to defer evaluation of already-evaluated list\n", | |
"(apply add `(1 2))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"(require racket/class)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
";; Define a class. Class names end in % by convention. Root class is builtin object%\n", | |
"(define relic%\n", | |
" (class object%\n", | |
" (super-new); superclass initialization, required. Position in definition depends upon whether other fields invoke superclass methods\n", | |
" (init age)\n", | |
" (define current-age age) ; Can't get init args outside of instantiation (e.g during method calls)\n", | |
" (define/public (get-age) current-age) ; Method getting current age\n", | |
" )\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 49, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>(object:relic% 1000)</code>" | |
], | |
"text/plain": [ | |
"(object:relic% 1000)" | |
] | |
}, | |
"execution_count": 49, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Create a class instance, passing the age field by name\n", | |
"(define some-relic (new relic% [age 1000]))\n", | |
"some_relic" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 51, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>1000</code>" | |
], | |
"text/plain": [ | |
"1000" | |
] | |
}, | |
"execution_count": 51, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Invoke a method using message passing\n", | |
"(send some-relic get-age)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"(define named-relic%\n", | |
" (class relic%\n", | |
" (init name age)\n", | |
" (super-new [age age])\n", | |
" (define current-name name)\n", | |
" (define/public (get-name) current-name)\n", | |
" \n", | |
" )\n", | |
" )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 127, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"Quran\" 1000)</code>" | |
], | |
"text/plain": [ | |
"'(\"Quran\" 1000)" | |
] | |
}, | |
"execution_count": 127, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define some-named-relic (new named-relic% [name \"Quran\"] [age 1000]))\n", | |
"(list (send some-named-relic get-name) (send some-named-relic get-age))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 77, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>(object:named-relic% 1200 \"Bible\")</code>" | |
], | |
"text/plain": [ | |
"(object:named-relic% 1200 \"Bible\")" | |
] | |
}, | |
"execution_count": 77, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Classes can be constructed by positional args\n", | |
"(define some-other-named-relic (instantiate named-relic% [\"Bible\" 1200]))\n", | |
"some-other-named-relic" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 78, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>(object:named-relic% 1200 \"Bible round\")</code>" | |
], | |
"text/plain": [ | |
"(object:named-relic% 1200 \"Bible round\")" | |
] | |
}, | |
"execution_count": 78, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Square and round brackets are interchangeable\n", | |
"(define some-other-named-relic-round (instantiate named-relic% (\"Bible round\" 1200)))\n", | |
"some-other-named-relic-round" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 84, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
";; Fields can be set\n", | |
"(define point%\n", | |
" (class object%\n", | |
" (init x y)\n", | |
" (super-new)\n", | |
" (define x_ x)\n", | |
" (define y_ y)\n", | |
" (define/public (get-x) x_)\n", | |
" (define/public (get-y) y_)\n", | |
" \n", | |
" (define/public (set-x x) (set! x_ x))\n", | |
" (define/public (set-y y) (set! y_ y))\n", | |
" )\n", | |
" )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 85, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>(object:point% 1.0 2.0)</code>" | |
], | |
"text/plain": [ | |
"(object:point% 1.0 2.0)" | |
] | |
}, | |
"execution_count": 85, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define p1 (new point% [x 1.0] [y 2.0]))\n", | |
"p1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 86, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>1.0</code>" | |
], | |
"text/plain": [ | |
"1.0" | |
] | |
}, | |
"execution_count": 86, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(send p1 get-x)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 92, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>9</code>" | |
], | |
"text/plain": [ | |
"9" | |
] | |
}, | |
"execution_count": 92, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(send p1 set-x 9)\n", | |
"(send p1 get-x)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 93, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>10</code>" | |
], | |
"text/plain": [ | |
"10" | |
] | |
}, | |
"execution_count": 93, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Set p1.x to p1.x + 1\n", | |
"(send p1 set-x (+ (send p1 get-x) 1))\n", | |
"(send p1 get-x)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 122, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"(require racket/math)\n", | |
"(define (euclidean-distance x y) (sqrt (+ (sqr x) (sqr y))))\n", | |
"(define vector%\n", | |
" (class point%\n", | |
" (super-new)\n", | |
" (inherit get-x get-y); non-method defines are assumed private fields, so we inherit get-x and get-y to permit calling them like (get-x)\n", | |
" (define/public (get-length) (euclidean-distance (get-x) (get-y))) \n", | |
" ;; This is the same as:\n", | |
" (define/public (get-length2) (euclidean-distance (send this get-x) (send this get-y))) \n", | |
" )\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 128, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(5.0 5.0)</code>" | |
], | |
"text/plain": [ | |
"'(5.0 5.0)" | |
] | |
}, | |
"execution_count": 128, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define v1 (new vector% [x 3.0] [y 4.0]))\n", | |
"(list (send v1 get-length) (send v1 get-length2))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## IO" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 89, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x \"y\" ~" | |
] | |
} | |
], | |
"source": [ | |
";; NB string formatting\n", | |
"(define x \"x\")\n", | |
"(define y \"y\")\n", | |
"\n", | |
"(printf \"~a ~v ~~\" x y)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 90, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"display x\n" | |
] | |
} | |
], | |
"source": [ | |
";; ~a refers to display:\n", | |
"(display \"display \")\n", | |
"(displayln \"x\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 91, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\"print \"\"x\"\n" | |
] | |
} | |
], | |
"source": [ | |
";; ~v refers to print:\n", | |
"(print \"print \")\n", | |
"(println \"x\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 176, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code><img style=\"display: inline; vertical-align: baseline; padding: 0pt; margin: 0pt; border: 0pt\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAcElEQVQYlY3QoRHCUBBF0ZOv\r\n", | |
"ImIpJj4yJUSE0igkFhiwVIFMClgEKzKI8N/MNfuu2ScioMGEBe9kyVuTjoILHhhxSkY8sytw\r\n", | |
"xh1tRNiDNrsZbhh+pZ084AobugOxw1p8E/6k4IX+wOnTqX+mbp7awT8daWL0QpmoRQAAAABJ\r\n", | |
"RU5ErkJggg==\r\n", | |
"\"/></code>" | |
], | |
"text/plain": [ | |
"(pict '(prog #<procedure:...rivate/utils.rkt:282:8> 10) 10 10 10 0 '() #f #f)" | |
] | |
}, | |
"execution_count": 176, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"\n", | |
"(circle 10)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Conditions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 170, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"(define x 100)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 173, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>#<eof></code>" | |
], | |
"text/plain": [ | |
"#<eof>" | |
] | |
}, | |
"execution_count": 173, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(read-line)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 172, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x is positive!\n" | |
] | |
} | |
], | |
"source": [ | |
"(if (positive? x)\n", | |
" (displayln \"x is positive!\")\n", | |
" (displayln \"x is not positive!\"))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Loops" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 138, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0\n", | |
"1\n", | |
"2\n", | |
"3\n" | |
] | |
} | |
], | |
"source": [ | |
"(for ([i `(0 1 2 3)])\n", | |
" (println i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 139, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0\n", | |
"1\n", | |
"2\n", | |
"3\n" | |
] | |
} | |
], | |
"source": [ | |
";; Simarly, using an in-range shorthand\n", | |
"(for ([i 4])\n", | |
" (println i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 140, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0\n", | |
"1\n", | |
"2\n", | |
"3\n" | |
] | |
} | |
], | |
"source": [ | |
";; Simarly, using in-range\n", | |
"(for ([i (in-range 4)])\n", | |
" (println i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 141, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"5\n", | |
"6\n", | |
"7\n", | |
"8\n", | |
"9\n" | |
] | |
} | |
], | |
"source": [ | |
";; Simarly, using in-range\n", | |
"(for ([i (in-range 5 10)])\n", | |
" (println i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x=0. y=0\n", | |
"x=1. y=1\n", | |
"x=2. y=2\n" | |
] | |
} | |
], | |
"source": [ | |
";; Parallel execution, terminates for shortest\n", | |
"(for ([x 4] [y 3])\n", | |
" (printf \"x=~a. y=~a\\n\" x y))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x=0. y=0\n", | |
"x=0. y=1\n", | |
"x=0. y=2\n", | |
"x=1. y=0\n", | |
"x=1. y=1\n", | |
"x=1. y=2\n", | |
"x=2. y=0\n", | |
"x=2. y=1\n", | |
"x=2. y=2\n", | |
"x=3. y=0\n", | |
"x=3. y=1\n", | |
"x=3. y=2\n" | |
] | |
} | |
], | |
"source": [ | |
";; Sequences can instead be nested using for*\n", | |
"(for* ([x 4] [y 3])\n", | |
" (printf \"x=~a. y=~a\\n\" x y))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x=0. y=0\n", | |
"x=0. y=1\n", | |
"x=0. y=2\n", | |
"x=2. y=0\n", | |
"x=2. y=1\n", | |
"x=2. y=2\n", | |
"x=3. y=0\n", | |
"x=3. y=1\n", | |
"x=3. y=2\n" | |
] | |
} | |
], | |
"source": [ | |
";; Only evaluate body when condition holds true\n", | |
"(for* ([x 4] [y 3] #:when (not (equal? x 1)))\n", | |
" (printf \"x=~a. y=~a\\n\" x y))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x=0. y=0\n", | |
"x=0. y=1\n", | |
"x=0. y=2\n", | |
"x=2. y=0\n", | |
"x=2. y=1\n", | |
"x=2. y=2\n", | |
"x=3. y=0\n", | |
"x=3. y=1\n", | |
"x=3. y=2\n" | |
] | |
} | |
], | |
"source": [ | |
";; Can also use \"(when ...)\" which evaluates to #<void> if the condition is false\n", | |
"(for* ([x 4] [y 3])\n", | |
" (when (not (equal? x 1)) \n", | |
" (printf \"x=~a. y=~a\\n\" x y)\n", | |
" )\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"x=0. y=0\n", | |
"x=0. y=1\n", | |
"x=0. y=2\n", | |
"x=2. y=0\n", | |
"x=2. y=1\n", | |
"x=2. y=2\n", | |
"x=3. y=0\n", | |
"x=3. y=1\n", | |
"x=3. y=2\n", | |
"vs\n", | |
"x=0. y=0\n", | |
"x=2. y=2\n" | |
] | |
} | |
], | |
"source": [ | |
";; Bindings separated by \"#:when\" clauses become *nested*, even in case of \"for\"\n", | |
"(for ([x 4] #:when (not (equal? x 1)) [y 3] )\n", | |
" (printf \"x=~a. y=~a\\n\" x y))\n", | |
"\n", | |
"(displayln \"vs\")\n", | |
"\n", | |
"(for ([x 4] [y 3] #:when (not (equal? x 1)))\n", | |
" (printf \"x=~a. y=~a\\n\" x y))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(0 1 2 3)</code>" | |
], | |
"text/plain": [ | |
"'(0 1 2 3)" | |
] | |
}, | |
"execution_count": 35, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; List comprehensions:\n", | |
"(for/list ([i 4]) i)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2) (3 0) (3 1) (3 2))</code>" | |
], | |
"text/plain": [ | |
"'((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2) (3 0) (3 1) (3 2))" | |
] | |
}, | |
"execution_count": 36, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(for*/list ([i 4] [j 3]) (list i j))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>#f</code>" | |
], | |
"text/plain": [ | |
"#f" | |
] | |
}, | |
"execution_count": 37, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Equivalents to python's all() over a list comprehension\n", | |
"(for/and ([i 4]) (even? i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>#t</code>" | |
], | |
"text/plain": [ | |
"#t" | |
] | |
}, | |
"execution_count": 38, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Equivalents to python's any() over a list comprehension\n", | |
"(for/or ([i 4]) (even? i))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 42, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>#t</code>" | |
], | |
"text/plain": [ | |
"#t" | |
] | |
}, | |
"execution_count": 42, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Showing the range semantics again\n", | |
"(for/and ([i (in-range 2 6 2)]) (even? i));; Showing the range semantics again\n", | |
"(for/and ([i (in-range 2 6 2)]) (or (even? i) (println i)))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 44, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0\n", | |
"1\n", | |
"2\n", | |
"3\n", | |
"4\n", | |
"5\n", | |
"6\n", | |
"7\n", | |
"8\n", | |
"9\n" | |
] | |
} | |
], | |
"source": [ | |
";; Endless loop (like itertools.count), using break to stop loop\n", | |
"(for ([i (in-naturals)]\n", | |
" #:break (equal? i 10))\n", | |
" (println i)\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 160, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(1 1.4142135623730951 1.7320508075688772 2)</code>" | |
], | |
"text/plain": [ | |
"'(1 1.4142135623730951 1.7320508075688772 2)" | |
] | |
}, | |
"execution_count": 160, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(map sqrt (list 1 2 3 4))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 163, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(2 3 4 5)</code>" | |
], | |
"text/plain": [ | |
"'(2 3 4 5)" | |
] | |
}, | |
"execution_count": 163, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(map (lambda (x) (+ x 1)) \n", | |
" (list 1 2 3 4)\n", | |
" )" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 169, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>0</code>" | |
], | |
"text/plain": [ | |
"0" | |
] | |
}, | |
"execution_count": 169, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(and 1 2 3 4 \"bob\" 0)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Pairs" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 54, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"x\" . \"y\")</code>" | |
], | |
"text/plain": [ | |
"'(\"x\" . \"y\")" | |
] | |
}, | |
"execution_count": 54, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Create a pair\n", | |
"(define t1 (cons \"x\" \"y\"))\n", | |
"t1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 108, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"p\" . \"q\")</code>" | |
], | |
"text/plain": [ | |
"'(\"p\" . \"q\")" | |
] | |
}, | |
"execution_count": 108, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Create from dot notation\n", | |
"(define t2 `(\"p\" . \"q\"))\n", | |
"t2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 55, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>\"x\"</code>" | |
], | |
"text/plain": [ | |
"\"x\"" | |
] | |
}, | |
"execution_count": 55, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; First item\n", | |
"(car t1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 56, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>\"y\"</code>" | |
], | |
"text/plain": [ | |
"\"y\"" | |
] | |
}, | |
"execution_count": 56, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Remaining items\n", | |
"(cdr t1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"(car l1) = \"x\"\n", | |
"(cdr l1) = '(\"y\" \"z\")" | |
] | |
} | |
], | |
"source": [ | |
";; car and cdr with lists\n", | |
"(define l1 (list \"x\" \"y\" \"z\"))\n", | |
"(printf \"(car l1) = ~v\\n\" (car l1))\n", | |
"(printf \"(cdr l1) = ~v\" (cdr l1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 98, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(#t #t)</code>" | |
], | |
"text/plain": [ | |
"'(#t #t)" | |
] | |
}, | |
"execution_count": 98, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Lists evaluate as pairs\n", | |
"(list (pair? t1) (pair? l1))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 109, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(0 1 . 2)</code>" | |
], | |
"text/plain": [ | |
"'(0 1 . 2)" | |
] | |
}, | |
"execution_count": 109, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Printing is wacky when joining a pair into a list\n", | |
"(cons 0 (cons 1 2))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 110, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(0 1 . 2)</code>" | |
], | |
"text/plain": [ | |
"'(0 1 . 2)" | |
] | |
}, | |
"execution_count": 110, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; This equates to:\n", | |
"'(0 . (1 . 2))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Lists" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 145, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"jack\" \"jill\")</code>" | |
], | |
"text/plain": [ | |
"'(\"jack\" \"jill\")" | |
] | |
}, | |
"execution_count": 145, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define names (list \"jack\" \"jill\"))\n", | |
"names" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 146, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>2</code>" | |
], | |
"text/plain": [ | |
"2" | |
] | |
}, | |
"execution_count": 146, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(length names)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 151, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"jack\" \"jill\" \"bob\" \"alice\")</code>" | |
], | |
"text/plain": [ | |
"'(\"jack\" \"jill\" \"bob\" \"alice\")" | |
] | |
}, | |
"execution_count": 151, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(define all-names (append names (list \"bob\" \"alice\")))\n", | |
"all-names" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 152, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>\"jack\"</code>" | |
], | |
"text/plain": [ | |
"\"jack\"" | |
] | |
}, | |
"execution_count": 152, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(list-ref all-names 0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 153, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>\"jack\"</code>" | |
], | |
"text/plain": [ | |
"\"jack\"" | |
] | |
}, | |
"execution_count": 153, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(car all-names)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 154, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"jill\" \"bob\" \"alice\")</code>" | |
], | |
"text/plain": [ | |
"'(\"jill\" \"bob\" \"alice\")" | |
] | |
}, | |
"execution_count": 154, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(cdr all-names)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 155, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"alice\" \"bob\" \"jill\" \"jack\")</code>" | |
], | |
"text/plain": [ | |
"'(\"alice\" \"bob\" \"jill\" \"jack\")" | |
] | |
}, | |
"execution_count": 155, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(reverse all-names)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 156, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>#f</code>" | |
], | |
"text/plain": [ | |
"#f" | |
] | |
}, | |
"execution_count": 156, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(member \"ryan\" all-names)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 157, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(\"jack\" \"jill\" \"bob\" \"alice\")</code>" | |
], | |
"text/plain": [ | |
"'(\"jack\" \"jill\" \"bob\" \"alice\")" | |
] | |
}, | |
"execution_count": 157, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(member \"jack\" all-names)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Quotes" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 111, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(+ 1 2)</code>" | |
], | |
"text/plain": [ | |
"'(+ 1 2)" | |
] | |
}, | |
"execution_count": 111, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; (quote datum) produces a _constant_ value corresponding to datum (the representation of the program fragment)\n", | |
"(quote (+ 1 2))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 112, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'((1 2) (3 4))</code>" | |
], | |
"text/plain": [ | |
"'((1 2) (3 4))" | |
] | |
}, | |
"execution_count": 112, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Note that nested lists don't print with quotes\n", | |
"(list (list 1 2) (list 3 4))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 114, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(list (list 1 2) (list 3 4))</code>" | |
], | |
"text/plain": [ | |
"'(list (list 1 2) (list 3 4))" | |
] | |
}, | |
"execution_count": 114, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; But we can obtain this behaviour with (quote ...)\n", | |
"(quote (list (list 1 2) (list 3 4)))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Symbols" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 120, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'some-symbol</code>" | |
], | |
"text/plain": [ | |
"'some-symbol" | |
] | |
}, | |
"execution_count": 120, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Identifiers wrapped with quotes are _symbols_\n", | |
"(define some-symbol (quote some-symbol))\n", | |
"some-symbol" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 121, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>\"some-symbol\"</code>" | |
], | |
"text/plain": [ | |
"\"some-symbol\"" | |
] | |
}, | |
"execution_count": 121, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Symbols are more like strings than identifiers:\n", | |
"(symbol->string some-symbol)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 122, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'some-symbol</code>" | |
], | |
"text/plain": [ | |
"'some-symbol" | |
] | |
}, | |
"execution_count": 122, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"(string->symbol \"some-symbol\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 126, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(jack jill)</code>" | |
], | |
"text/plain": [ | |
"'(jack jill)" | |
] | |
}, | |
"execution_count": 126, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; Create a list of symbols\n", | |
"(quote (jack jill))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 127, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(jack jill)</code>" | |
], | |
"text/plain": [ | |
"'(jack jill)" | |
] | |
}, | |
"execution_count": 127, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
";; This is analogous to\n", | |
"'(jack jill)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# The reader and expander layers\n", | |
"https://docs.racket-lang.org/guide/Pairs__Lists__and_Racket_Syntax.html\n", | |
"\n", | |
"The syntax of Racket is not defined directly in terms of character streams. Instead, the syntax is determined by two layers:\n", | |
"* a reader layer, which turns a sequence of characters into lists, symbols, and other constants; and\n", | |
"* an expander layer, which processes the lists, symbols, and other constants to parse them as an expression." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 136, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<code>'(+ 1 2 3)</code>" | |
], | |
"text/plain": [ | |
"'(+ 1 2 3)" | |
] | |
}, | |
"execution_count": 136, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"`(+ 1 . (2 3))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Racket", | |
"language": "racket", | |
"name": "racket" | |
}, | |
"language_info": { | |
"codemirror_mode": "scheme", | |
"file_extension": ".rkt", | |
"mimetype": "text/x-racket", | |
"name": "Racket", | |
"pygments_lexer": "racket", | |
"version": "7.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment