git.fiddlerwoaroof.com
Browse code

feat: improve hashtable printer

Ed Langley authored on 29/10/2020 23:26:31
Showing 3 changed files
... ...
@@ -128,7 +128,6 @@
128 128
    :               "title": "write-better-documentation",
129 129
    :               "completed": YASON:FALSE>)
130 130
   
131
-   
132 131
 * Routing
133 132
 
134 133
 ** Routing utilities
... ...
@@ -3,7 +3,7 @@
3 3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5 5
 <head>
6
-<!-- 2019-09-10 Tue 16:30 -->
6
+<!-- 2019-09-25 Wed 21:02 -->
7 7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8 8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
9 9
 <title>TODO backend implementation using CL and fukamachi/ningle</title>
... ...
@@ -300,34 +300,34 @@ for the JavaScript code in this tag.
300 300
 <h2>Table of Contents</h2>
301 301
 <div id="text-table-of-contents">
302 302
 <ul>
303
-<li><a href="#org2c60c2a">1. Setup</a></li>
304
-<li><a href="#org8b48160">2. todo API</a>
303
+<li><a href="#org9cdd67c">1. Setup</a></li>
304
+<li><a href="#org4320cff">2. todo API</a>
305 305
 <ul>
306
-<li><a href="#orgddfdad7">2.1. List-level APIs</a></li>
307
-<li><a href="#orge78579a">2.2. Getting/Replacing a todo</a></li>
308
-<li><a href="#org1d8273a">2.3. Adding and modifying todos</a></li>
309
-<li><a href="#orgd06e313">2.4. Examples</a></li>
306
+<li><a href="#org0212081">2.1. List-level APIs</a></li>
307
+<li><a href="#org4f066d5">2.2. Getting/Replacing a todo</a></li>
308
+<li><a href="#orge9f5122">2.3. Adding and modifying todos</a></li>
309
+<li><a href="#org745149a">2.4. Examples</a></li>
310 310
 </ul>
311 311
 </li>
312
-<li><a href="#orgf16a59b">3. Routing</a>
312
+<li><a href="#orgc967bea">3. Routing</a>
313 313
 <ul>
314
-<li><a href="#org8fa2aba">3.1. Routing utilities</a></li>
315
-<li><a href="#org104511b">3.2. todo routes</a></li>
314
+<li><a href="#org43beaea">3.1. Routing utilities</a></li>
315
+<li><a href="#org1b71e8e">3.2. todo routes</a></li>
316 316
 </ul>
317 317
 </li>
318
-<li><a href="#org27ea61c">4. Source</a>
318
+<li><a href="#orga9b0a0d">4. Source</a>
319 319
 <ul>
320
-<li><a href="#orgc9b940b">4.1. model.lisp source code</a></li>
321
-<li><a href="#orge55bf4b">4.2. routing.lisp source</a></li>
322
-<li><a href="#org714745a">4.3. main.lisp source</a></li>
320
+<li><a href="#org87d2e6f">4.1. model.lisp source code</a></li>
321
+<li><a href="#org8641414">4.2. routing.lisp source</a></li>
322
+<li><a href="#org99a4e68">4.3. main.lisp source</a></li>
323 323
 </ul>
324 324
 </li>
325 325
 </ul>
326 326
 </div>
327 327
 </div>
328 328
 
329
-<div id="outline-container-org2c60c2a" class="outline-2">
330
-<h2 id="org2c60c2a"><span class="section-number-2">1</span> Setup</h2>
329
+<div id="outline-container-org9cdd67c" class="outline-2">
330
+<h2 id="org9cdd67c"><span class="section-number-2">1</span> Setup</h2>
331 331
 <div class="outline-text-2" id="text-1">
332 332
 <ul class="org-ul">
333 333
 <li><code class="src src-sh">git clone https://github.com/fiddlerwoaroof/data-lens.git ~/quicklisp/local-projects/data-lens</code></li>
... ...
@@ -347,8 +347,8 @@ After this, all the tests <a href="http://www.todobackend.com/specs/index.html?h
347 347
 </div>
348 348
 </div>
349 349
 
350
-<div id="outline-container-org8b48160" class="outline-2">
351
-<h2 id="org8b48160"><span class="section-number-2">2</span> todo API</h2>
350
+<div id="outline-container-org4320cff" class="outline-2">
351
+<h2 id="org4320cff"><span class="section-number-2">2</span> todo API</h2>
352 352
 <div class="outline-text-2" id="text-2">
353 353
 <p>
354 354
 We use a fairly simple structure for our "database": a fset map (a
... ...
@@ -358,8 +358,8 @@ referenced as <code>*todo*</code>, but this is a detail hidden behind the API.
358 358
 </p>
359 359
 </div>
360 360
 
361
-<div id="outline-container-orgddfdad7" class="outline-3">
362
-<h3 id="orgddfdad7"><span class="section-number-3">2.1</span> List-level APIs</h3>
361
+<div id="outline-container-org0212081" class="outline-3">
362
+<h3 id="org0212081"><span class="section-number-3">2.1</span> List-level APIs</h3>
363 363
 <div class="outline-text-3" id="text-2-1">
364 364
 <p>
365 365
 These are functions for getting the todo list and clearing
... ...
@@ -368,7 +368,7 @@ and <code>clear-todos</code> for DELETE requests.
368 368
 </p>
369 369
 
370 370
 <div class="org-src-container">
371
-<pre class="src src-lisp" id="org2fa86a6"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todos</span> <span style="color: #93a8c6;">()</span>
371
+<pre class="src src-lisp" id="org96c36b7"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todos</span> <span style="color: #93a8c6;">()</span>
372 372
   <span style="color: #93a8c6;">(</span>gmap:gmap <span style="font-weight: bold;">:seq</span>
373 373
              <span style="color: #b0b1a3;">(</span><span style="color: #F0DFAF;">lambda</span> <span style="color: #97b098;">(</span>_ b<span style="color: #97b098;">)</span>
374 374
                <span style="color: #97b098;">(</span><span style="color: #F0DFAF;">declare</span> <span style="color: #aebed8;">(</span>ignore _<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span>
... ...
@@ -383,8 +383,8 @@ and <code>clear-todos</code> for DELETE requests.
383 383
 </div>
384 384
 </div>
385 385
 
386
-<div id="outline-container-orge78579a" class="outline-3">
387
-<h3 id="orge78579a"><span class="section-number-3">2.2</span> Getting/Replacing a todo</h3>
386
+<div id="outline-container-org4f066d5" class="outline-3">
387
+<h3 id="org4f066d5"><span class="section-number-3">2.2</span> Getting/Replacing a todo</h3>
388 388
 <div class="outline-text-3" id="text-2-2">
389 389
 <p>
390 390
 This uses lisp's <a href="http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm">generalized references</a> to abstract away the
... ...
@@ -394,7 +394,7 @@ the GET request for a specific todo by id.
394 394
 </p>
395 395
 
396 396
 <div class="org-src-container">
397
-<pre class="src src-lisp" id="orge96683a"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todo</span> <span style="color: #93a8c6;">(</span>id<span style="color: #93a8c6;">)</span>
397
+<pre class="src src-lisp" id="org8282374"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">todo</span> <span style="color: #93a8c6;">(</span>id<span style="color: #93a8c6;">)</span>
398 398
   <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">let</span> <span style="color: #b0b1a3;">(</span><span style="color: #97b098;">(</span>todo <span style="color: #aebed8;">(</span>fset:@ *todos* id<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span>
399 399
     todo<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
400 400
 
... ...
@@ -410,8 +410,8 @@ the GET request for a specific todo by id.
410 410
 </div>
411 411
 </div>
412 412
 
413
-<div id="outline-container-org1d8273a" class="outline-3">
414
-<h3 id="org1d8273a"><span class="section-number-3">2.3</span> Adding and modifying todos</h3>
413
+<div id="outline-container-orge9f5122" class="outline-3">
414
+<h3 id="orge9f5122"><span class="section-number-3">2.3</span> Adding and modifying todos</h3>
415 415
 <div class="outline-text-3" id="text-2-3">
416 416
 <p>
417 417
 <code>new-todo</code> is fairly trivial. It's main feature is that it has to
... ...
@@ -421,7 +421,7 @@ properly. <code>new-todo</code> backs POST requests to the root endpoint.
421 421
 </p>
422 422
 
423 423
 <div class="org-src-container">
424
-<pre class="src src-lisp" id="orgf6c3a44"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defvar</span> <span style="color: #DC8CC3;">*external-host*</span>
424
+<pre class="src src-lisp" id="orgbeae4f5"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defvar</span> <span style="color: #DC8CC3;">*external-host*</span>
425 425
   <span style="color: #D0BF8F;">"localhost"</span><span style="color: #8c8c8c;">)</span>
426 426
 <span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defvar</span> <span style="color: #DC8CC3;">*external-port*</span>
427 427
   5000<span style="color: #8c8c8c;">)</span>
... ...
@@ -450,7 +450,7 @@ todo endpoint for a specific ID.
450 450
 </p>
451 451
 
452 452
 <div class="org-src-container">
453
-<pre class="src src-lisp" id="org0a1e71e"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">update-todo</span> <span style="color: #93a8c6;">(</span>id v<span style="color: #93a8c6;">)</span>
453
+<pre class="src src-lisp" id="orgc65925d"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">update-todo</span> <span style="color: #93a8c6;">(</span>id v<span style="color: #93a8c6;">)</span>
454 454
   <span style="color: #93a8c6;">(</span><span style="color: #F0DFAF;">let*</span> <span style="color: #b0b1a3;">(</span><span style="color: #97b098;">(</span>old-todo <span style="color: #aebed8;">(</span>or <span style="color: #b0b0b3;">(</span>todo id<span style="color: #b0b0b3;">)</span>
455 455
                        <span style="color: #b0b0b3;">(</span>make-hash-table <span style="font-weight: bold;">:test</span> 'equal<span style="color: #b0b0b3;">)</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span>
456 456
          <span style="color: #97b098;">(</span>in-hash-table <span style="color: #aebed8;">(</span>alexandria:alist-hash-table v <span style="font-weight: bold;">:test</span> 'equal<span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span>
... ...
@@ -465,8 +465,8 @@ todo endpoint for a specific ID.
465 465
 </div>
466 466
 </div>
467 467
 
468
-<div id="outline-container-orgd06e313" class="outline-3">
469
-<h3 id="orgd06e313"><span class="section-number-3">2.4</span> Examples</h3>
468
+<div id="outline-container-org745149a" class="outline-3">
469
+<h3 id="org745149a"><span class="section-number-3">2.4</span> Examples</h3>
470 470
 <div class="outline-text-3" id="text-2-4">
471 471
 <div class="org-src-container">
472 472
 <pre class="src src-lisp"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">in-package</span> <span style="font-weight: bold;">:fwoar.todo</span><span style="color: #8c8c8c;">)</span>
... ...
@@ -481,10 +481,10 @@ todo endpoint for a specific ID.
481 481
 </div>
482 482
 
483 483
 <pre class="example">
484
-(#&lt;hash-table "url": "http://localhost:5000/todo/9",
484
+(#&lt;hash-table "url": "http://localhost:5000/todo/1",
485 485
               "title": "get groceries",
486 486
               "completed": YASON:FALSE&gt;
487
- #&lt;hash-table "url": "http://localhost:5000/todo/10",
487
+ #&lt;hash-table "url": "http://localhost:5000/todo/2",
488 488
               "title": "write-better-documentation",
489 489
               "completed": YASON:FALSE&gt;)
490 490
 </pre>
... ...
@@ -492,13 +492,12 @@ todo endpoint for a specific ID.
492 492
 </div>
493 493
 </div>
494 494
 
495
-
496
-<div id="outline-container-orgf16a59b" class="outline-2">
497
-<h2 id="orgf16a59b"><span class="section-number-2">3</span> Routing</h2>
495
+<div id="outline-container-orgc967bea" class="outline-2">
496
+<h2 id="orgc967bea"><span class="section-number-2">3</span> Routing</h2>
498 497
 <div class="outline-text-2" id="text-3">
499 498
 </div>
500
-<div id="outline-container-org8fa2aba" class="outline-3">
501
-<h3 id="org8fa2aba"><span class="section-number-3">3.1</span> Routing utilities</h3>
499
+<div id="outline-container-org43beaea" class="outline-3">
500
+<h3 id="org43beaea"><span class="section-number-3">3.1</span> Routing utilities</h3>
502 501
 <div class="outline-text-3" id="text-3-1">
503 502
 <p>
504 503
 The core utility here is the <code>defroutes</code> macro.  This takes a
... ...
@@ -508,7 +507,7 @@ routes.
508 507
 </p>
509 508
 
510 509
 <div class="org-src-container">
511
-<pre class="src src-lisp" id="org2c1405a"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defmacro</span> <span style="color: #8CD0D3;">defroutes</span> <span style="color: #93a8c6;">(</span>app <span style="color: #CC9393;">&amp;body</span> routes<span style="color: #93a8c6;">)</span>
510
+<pre class="src src-lisp" id="orgd30e492"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defmacro</span> <span style="color: #8CD0D3;">defroutes</span> <span style="color: #93a8c6;">(</span>app <span style="color: #CC9393;">&amp;body</span> routes<span style="color: #93a8c6;">)</span>
512 511
   <span style="color: #93a8c6;">(</span>alexandria:once-only <span style="color: #b0b1a3;">(</span>app<span style="color: #b0b1a3;">)</span>
513 512
     `<span style="color: #b0b1a3;">(</span>setf
514 513
       ,@<span style="color: #97b098;">(</span><span style="color: #F0DFAF;">loop</span> for <span style="color: #aebed8;">(</span>target . descriptors<span style="color: #aebed8;">)</span> in routes
... ...
@@ -552,7 +551,7 @@ that all the API results get JSON encoded.
552 551
 </p>
553 552
 
554 553
 <div class="org-src-container">
555
-<pre class="src src-lisp" id="orgd63e2a0"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">success</span> <span style="color: #93a8c6;">(</span>value<span style="color: #93a8c6;">)</span>
554
+<pre class="src src-lisp" id="org4594387"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">success</span> <span style="color: #93a8c6;">(</span>value<span style="color: #93a8c6;">)</span>
556 555
   <span style="color: #93a8c6;">(</span>list 200 '<span style="color: #b0b1a3;">(</span><span style="font-weight: bold;">:conent-type</span> <span style="color: #D0BF8F;">"application/json"</span><span style="color: #b0b1a3;">)</span> value<span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
557 556
 
558 557
 <span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defmacro</span> <span style="color: #8CD0D3;">handler</span> <span style="color: #93a8c6;">(</span><span style="color: #b0b1a3;">(</span><span style="color: #CC9393;">&amp;optional</span> <span style="color: #97b098;">(</span>sym <span style="color: #aebed8;">(</span>gensym <span style="color: #D0BF8F;">"PARAMS"</span><span style="color: #aebed8;">)</span><span style="color: #97b098;">)</span><span style="color: #b0b1a3;">)</span> <span style="color: #CC9393;">&amp;body</span> body<span style="color: #93a8c6;">)</span>
... ...
@@ -566,8 +565,8 @@ that all the API results get JSON encoded.
566 565
 </div>
567 566
 </div>
568 567
 
569
-<div id="outline-container-org104511b" class="outline-3">
570
-<h3 id="org104511b"><span class="section-number-3">3.2</span> todo routes</h3>
568
+<div id="outline-container-org1b71e8e" class="outline-3">
569
+<h3 id="org1b71e8e"><span class="section-number-3">3.2</span> todo routes</h3>
571 570
 <div class="outline-text-3" id="text-3-2">
572 571
 <p>
573 572
 <code>setup-routes</code> binds the endpoints to handlers: <code>"/"</code> to handlers
... ...
@@ -579,7 +578,7 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
579 578
 </p>
580 579
 
581 580
 <div class="org-src-container">
582
-<pre class="src src-lisp" id="org8c6228c"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">routing</span>
581
+<pre class="src src-lisp" id="org148c9f4"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">routing</span>
583 582
 <span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">defun</span> <span style="color: #8CD0D3;">get-id</span> <span style="color: #93a8c6;">(</span>params<span style="color: #93a8c6;">)</span>
584 583
   <span style="color: #93a8c6;">(</span>parse-integer <span style="color: #b0b1a3;">(</span>serapeum:assocdr <span style="font-weight: bold;">:id</span> params<span style="color: #b0b1a3;">)</span><span style="color: #93a8c6;">)</span><span style="color: #8c8c8c;">)</span>
585 584
 
... ...
@@ -601,12 +600,12 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
601 600
 </div>
602 601
 </div>
603 602
 
604
-<div id="outline-container-org27ea61c" class="outline-2">
605
-<h2 id="org27ea61c"><span class="section-number-2">4</span> Source</h2>
603
+<div id="outline-container-orga9b0a0d" class="outline-2">
604
+<h2 id="orga9b0a0d"><span class="section-number-2">4</span> Source</h2>
606 605
 <div class="outline-text-2" id="text-4">
607 606
 </div>
608
-<div id="outline-container-orgc9b940b" class="outline-3">
609
-<h3 id="orgc9b940b"><span class="section-number-3">4.1</span> model.lisp source code</h3>
607
+<div id="outline-container-org87d2e6f" class="outline-3">
608
+<h3 id="org87d2e6f"><span class="section-number-3">4.1</span> model.lisp source code</h3>
610 609
 <div class="outline-text-3" id="text-4-1">
611 610
 <div class="org-src-container">
612 611
 <pre class="src src-lisp"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">[[file:~/git_repos/lisp-sandbox/todo/README.org::package-include][package-include]]</span>
... ...
@@ -698,8 +697,8 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
698 697
 </div>
699 698
 </div>
700 699
 
701
-<div id="outline-container-orge55bf4b" class="outline-3">
702
-<h3 id="orge55bf4b"><span class="section-number-3">4.2</span> routing.lisp source</h3>
700
+<div id="outline-container-org8641414" class="outline-3">
701
+<h3 id="org8641414"><span class="section-number-3">4.2</span> routing.lisp source</h3>
703 702
 <div class="outline-text-3" id="text-4-2">
704 703
 <div class="org-src-container">
705 704
 <pre class="src src-lisp"><span style="color: #A6A689; background-color: #2B2B2B;">;; </span><span style="color: #A6A689; background-color: #2B2B2B;">[[file:~/git_repos/lisp-sandbox/todo/README.org::package-include][package-include]]</span>
... ...
@@ -753,8 +752,8 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
753 752
 </div>
754 753
 </div>
755 754
 
756
-<div id="outline-container-org714745a" class="outline-3">
757
-<h3 id="org714745a"><span class="section-number-3">4.3</span> main.lisp source</h3>
755
+<div id="outline-container-org99a4e68" class="outline-3">
756
+<h3 id="org99a4e68"><span class="section-number-3">4.3</span> main.lisp source</h3>
758 757
 <div class="outline-text-3" id="text-4-3">
759 758
 <div class="org-src-container">
760 759
 <pre class="src src-lisp"><span style="color: #8c8c8c;">(</span><span style="color: #F0DFAF;">in-package</span> <span style="font-weight: bold;">:fwoar.todo</span><span style="color: #8c8c8c;">)</span>
... ...
@@ -805,7 +804,7 @@ alist. <code>get-id</code> handles this, and extracts an integer for the id
805 804
 </div>
806 805
 <div id="postamble" class="status">
807 806
 <p class="author">Author: Langley</p>
808
-<p class="date">Created: 2019-09-10 Tue 16:30</p>
807
+<p class="date">Created: 2019-09-25 Wed 21:02</p>
809 808
 <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
810 809
 </div>
811 810
 </body>
... ...
@@ -1,18 +1,19 @@
1 1
 (in-package :cl-user)
2
-(defparameter *old-pprint-dispatch* *print-pprint-dispatch*)
2
+(defvar *old-pprint-dispatch* *print-pprint-dispatch*)
3
+
3 4
 (setf *print-pprint-dispatch*
4 5
       (copy-pprint-dispatch *old-pprint-dispatch*))
5 6
 
6 7
 (defun pprint-hashtable (s hash-table)
7 8
   (pprint-logical-block (s nil)
8
-    (princ "#<hash-table "  s)
9
+    (princ "#<hash-table"  s)
9 10
     (let ((v (fset:convert 'list (fset:convert 'fset:map hash-table))))
10 11
       (when v
11 12
         (pprint-logical-block (s v)
12 13
           (pprint-indent :block 0 s)
13 14
           (loop do
14 15
             (destructuring-bind (key . value) (pprint-pop)
15
-              (format s "~s: ~s" key value)
16
+              (format s " ~s: ~s" key value)
16 17
               (pprint-exit-if-list-exhausted)
17 18
               (princ ", " s)
18 19
               (pprint-newline :mandatory s))))))