From 9764178e641925c17cb119402dc8594234ba1988 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:25:09 +0000 Subject: [PATCH] deploy: c6028964297d75320188124b24a025366bc2bd22 --- 404.html | 2 +- assets/js/0e384e19.2fffdb13.js | 1 - assets/js/0e384e19.40f95dee.js | 1 + assets/js/14a48451.793fa7b1.js | 1 - assets/js/14a48451.8909d26f.js | 1 + assets/js/69aa9e93.9610310b.js | 1 + assets/js/69aa9e93.e07ffa30.js | 1 - assets/js/840797c7.d1a126f2.js | 1 - assets/js/840797c7.f67dd511.js | 1 + assets/js/aa178e2b.4dce3999.js | 1 + assets/js/aa178e2b.5cdd7cd8.js | 1 - assets/js/c74dcec5.7f2a3cba.js | 1 - assets/js/c74dcec5.9ba30d21.js | 1 + assets/js/e1902777.0ed4601f.js | 1 - assets/js/e1902777.9a885760.js | 1 + assets/js/f724a01c.8598314e.js | 1 + assets/js/f724a01c.ae1d1792.js | 1 - ...n.aa43a91f.js => runtime~main.327e932f.js} | 2 +- blog.html | 2 +- blog/archive.html | 2 +- blog/authors.html | 2 +- blog/emacs-scheme-regex.html | 2 +- blog/lips-history.html | 2 +- blog/tags.html | 2 +- blog/tags/emacs.html | 2 +- blog/tags/history.html | 2 +- blog/tags/lips.html | 2 +- blog/tags/scheme.html | 2 +- docs/category/introduction-to-scheme.html | 2 +- docs/category/lips-introduction.html | 2 +- docs/intro.html | 22 ++++++------ docs/lips/REPL.html | 2 +- docs/lips/SRFI.html | 2 +- docs/lips/embeding-repl.html | 2 +- docs/lips/environments.html | 6 ++-- docs/lips/extension.html | 8 ++--- docs/lips/functional-helpers.html | 12 +++---- docs/lips/intro.html | 32 +++++++++--------- docs/lips/reflection.html | 2 +- docs/lips/sxml.html | 2 +- docs/scheme-intro/continuations.html | 2 +- docs/scheme-intro/core.html | 2 +- docs/scheme-intro/data-types.html | 2 +- docs/scheme-intro/input-output.html | 2 +- docs/scheme-intro/macros.html | 10 +++--- docs/scheme-intro/next-step.html | 6 ++-- docs/scheme-intro/streams.html | 2 +- docs/scheme-intro/what-is-lisp.html | 8 ++--- img/emacs-scheme-regex.png | Bin 200683 -> 200689 bytes index.html | 2 +- reference.html | 2 +- screenshooter.html | 2 +- sitemap.xml | 2 +- 53 files changed, 88 insertions(+), 88 deletions(-) delete mode 100644 assets/js/0e384e19.2fffdb13.js create mode 100644 assets/js/0e384e19.40f95dee.js delete mode 100644 assets/js/14a48451.793fa7b1.js create mode 100644 assets/js/14a48451.8909d26f.js create mode 100644 assets/js/69aa9e93.9610310b.js delete mode 100644 assets/js/69aa9e93.e07ffa30.js delete mode 100644 assets/js/840797c7.d1a126f2.js create mode 100644 assets/js/840797c7.f67dd511.js create mode 100644 assets/js/aa178e2b.4dce3999.js delete mode 100644 assets/js/aa178e2b.5cdd7cd8.js delete mode 100644 assets/js/c74dcec5.7f2a3cba.js create mode 100644 assets/js/c74dcec5.9ba30d21.js delete mode 100644 assets/js/e1902777.0ed4601f.js create mode 100644 assets/js/e1902777.9a885760.js create mode 100644 assets/js/f724a01c.8598314e.js delete mode 100644 assets/js/f724a01c.ae1d1792.js rename assets/js/{runtime~main.aa43a91f.js => runtime~main.327e932f.js} (62%) diff --git a/404.html b/404.html index ac8dc4e4..25a00a2f 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Page Not Found | LIPS Scheme - + diff --git a/assets/js/0e384e19.2fffdb13.js b/assets/js/0e384e19.2fffdb13.js deleted file mode 100644 index 763e7fb4..00000000 --- a/assets/js/0e384e19.2fffdb13.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunknew_docs=self.webpackChunknew_docs||[]).push([[3976],{2053:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"id":"intro","title":"Getting Started","description":"Browser","source":"@site/docs/intro.md","sourceDirName":".","slug":"/intro","permalink":"/docs/intro","draft":false,"unlisted":false,"editUrl":"https://github.com/jcubic/lips/tree/master/docs/docs/intro.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","next":{"title":"Introduction to Scheme","permalink":"/docs/category/introduction-to-scheme"}}');var t=s(4848),r=s(8453);const a={sidebar_position:1},c="Getting Started",o={},l=[{value:"Browser",id:"browser",level:2},{value:"Running Scheme Code Inline",id:"running-scheme-code-inline",level:3},{value:"Running External Scheme Code",id:"running-external-scheme-code",level:3},{value:"Node.js",id:"nodejs",level:2},{value:"Executing files",id:"executing-files",level:3},{value:"Executing expressions",id:"executing-expressions",level:3},{value:"Standalone scripts",id:"standalone-scripts",level:3},{value:"Node.js project",id:"nodejs-project",level:3},{value:"Executing LIPS prammatically",id:"executing-lips-prammatically",level:2},{value:"Creating REPL",id:"creating-repl",level:3},{value:"Bootstrapping",id:"bootstrapping",level:3},{value:"Dynamic Scope",id:"dynamic-scope",level:2},{value:"Rationale",id:"rationale",level:3},{value:"REPL",id:"repl",level:3},{value:"Script",id:"script",level:3},{value:"Interpreter",id:"interpreter",level:3},{value:"exec",id:"exec",level:3},{value:"Editor support",id:"editor-support",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"getting-started",children:"Getting Started"})}),"\n",(0,t.jsx)(n.h2,{id:"browser",children:"Browser"}),"\n",(0,t.jsx)(n.p,{children:"When using the LIPS Scheme interpreter in a browser, you need to include the main script file."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-html",children:' - + diff --git a/blog/archive.html b/blog/archive.html index f3e66fe0..ae0a1e2e 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -4,7 +4,7 @@ Archive | LIPS Scheme - + diff --git a/blog/authors.html b/blog/authors.html index 3cf1a680..a78cbb25 100644 --- a/blog/authors.html +++ b/blog/authors.html @@ -4,7 +4,7 @@ Authors | LIPS Scheme - + diff --git a/blog/emacs-scheme-regex.html b/blog/emacs-scheme-regex.html index cd106358..2385603a 100644 --- a/blog/emacs-scheme-regex.html +++ b/blog/emacs-scheme-regex.html @@ -4,7 +4,7 @@ Scheme Regex literals in Emacs | LIPS Scheme - + diff --git a/blog/lips-history.html b/blog/lips-history.html index 50e60721..17737fa1 100644 --- a/blog/lips-history.html +++ b/blog/lips-history.html @@ -4,7 +4,7 @@ LIPS Scheme History | LIPS Scheme - + diff --git a/blog/tags.html b/blog/tags.html index 969527df..801d984e 100644 --- a/blog/tags.html +++ b/blog/tags.html @@ -4,7 +4,7 @@ Tags | LIPS Scheme - + diff --git a/blog/tags/emacs.html b/blog/tags/emacs.html index 1f3c355d..282cff8d 100644 --- a/blog/tags/emacs.html +++ b/blog/tags/emacs.html @@ -4,7 +4,7 @@ One post tagged with "emacs" | LIPS Scheme - + diff --git a/blog/tags/history.html b/blog/tags/history.html index c95dbeaf..42076cb1 100644 --- a/blog/tags/history.html +++ b/blog/tags/history.html @@ -4,7 +4,7 @@ One post tagged with "history" | LIPS Scheme - + diff --git a/blog/tags/lips.html b/blog/tags/lips.html index 68ee2d82..7b177bc3 100644 --- a/blog/tags/lips.html +++ b/blog/tags/lips.html @@ -4,7 +4,7 @@ One post tagged with "lips" | LIPS Scheme - + diff --git a/blog/tags/scheme.html b/blog/tags/scheme.html index a9a6b6c8..b69eee26 100644 --- a/blog/tags/scheme.html +++ b/blog/tags/scheme.html @@ -4,7 +4,7 @@ 2 posts tagged with "scheme" | LIPS Scheme - + diff --git a/docs/category/introduction-to-scheme.html b/docs/category/introduction-to-scheme.html index 14d20427..f2ea8bf1 100644 --- a/docs/category/introduction-to-scheme.html +++ b/docs/category/introduction-to-scheme.html @@ -4,7 +4,7 @@ Introduction to Scheme | LIPS Scheme - + diff --git a/docs/category/lips-introduction.html b/docs/category/lips-introduction.html index aa787433..f0ff51eb 100644 --- a/docs/category/lips-introduction.html +++ b/docs/category/lips-introduction.html @@ -4,7 +4,7 @@ LIPS Documentation | LIPS Scheme - + diff --git a/docs/intro.html b/docs/intro.html index ecde1f31..2f0680b1 100644 --- a/docs/intro.html +++ b/docs/intro.html @@ -4,7 +4,7 @@ Getting Started | LIPS Scheme - + @@ -25,10 +25,10 @@

R (newline)) </script>
-

NOTE: Only the core of LIPS is written in JavaScript, almost half of it it's written in Scheme. +

info

Only the core of LIPS is written in JavaScript, almost half of it it's written in Scheme. So if you want to load the standard library (to have full LIPS), you should use bootstrap or data-bootstrap attribute that will load it for you. You can optionally specify the location of the -file.

+file.

<script type="text/x-scheme" bootstrap="https://cdn.jsdelivr.net/npm/@jcubic/lips@beta/dist/std.xcb">
 (let ((what "world")
       (greet "hello"))
@@ -38,7 +38,7 @@ 

R

xcb file is simple binary format that LIPS uses to speed up parsing the the code. You can also use .scm file or .min.scm file that may be little bit bigger.

-

NOTE The bootstrap attribute can also be included on main script tag with the JavaScript file.

+
info

The bootstrap attribute can also be included on main script tag with the JavaScript file.

Running External Scheme Code​

You can also use src attribute to link to source file. Like you normally do with JavaScript:

<script type="text/x-scheme" src="example.scm"><script>
@@ -90,8 +90,8 @@ 

Standalon

and execute the script by providing the name:

./script.scm
 
-

NOTE: by default most systems don't execute files in current directory so you need to provide ./ in front. -You can change that if you add dot (current working directory) to the $PATH environment variable:

+
info

By default most systems don't execute files in current directory so you need to provide ./ in front. +You can change that if you add dot (current working directory) to the $PATH environment variable:

export $PATH=".:$PATH"
 

If you prefer to install lips locally instead of globally you can use this shebang:

@@ -99,8 +99,8 @@

Standalon (let ((what "World")) (print (string-append "Hello " what)))

-

NOTE: if you run this code outside of Node.js project npx will install the -package before execution.

+
info

If you run this code outside of Node.js project npx will install the +package before execution.

Node.js project​

After you have installed LIPS you can create a new Node.js project and write LIPS Scheme code instead of JavaScript, using everything Node.js provides. See documentation about Integration with @@ -118,9 +118,9 @@

Node.js proje (write (braces "{01..10}" &(:expand #t))) ;; ==> #("01" "02" "03" "04" "05" "06" "07" "08" "09" "10")
-

NOTE: braces is a popular package to expand bash like +

info

braces is a popular package to expand bash like expressions, it's used as deep dependency for -TailwindCSS.

+TailwindCSS.

Executing LIPS prammatically​

You can also execute LIPS from JavaScript:

const { exec } = require('@jcubic/lips');
@@ -161,7 +161,7 @@ 

Creating REPL<

Anything you add to the object passed to Interpreter will be added to global scope.

The Interpreter have a method exec that work the same as thhe one exported from LIPS.

Bootstrapping​

-

Note: that you also need to bootstrap the standard library to have fully working Scheme system.

+
info

Note that you also need to bootstrap the standard library to have fully working Scheme system.

await interpreter.exec(`(let-env lips.env.__parent__
                           (load "<path or URL>/dist/std.xcb"))`);
 
diff --git a/docs/lips/REPL.html b/docs/lips/REPL.html index a2b0c722..af730c55 100644 --- a/docs/lips/REPL.html +++ b/docs/lips/REPL.html @@ -4,7 +4,7 @@ REPL | LIPS Scheme - + diff --git a/docs/lips/SRFI.html b/docs/lips/SRFI.html index 7cbb2c7d..4617f9f7 100644 --- a/docs/lips/SRFI.html +++ b/docs/lips/SRFI.html @@ -4,7 +4,7 @@ SRFI | LIPS Scheme - + diff --git a/docs/lips/embeding-repl.html b/docs/lips/embeding-repl.html index a92ecab6..f2668fac 100644 --- a/docs/lips/embeding-repl.html +++ b/docs/lips/embeding-repl.html @@ -4,7 +4,7 @@ Embedding LIPS REPL | LIPS Scheme - + diff --git a/docs/lips/environments.html b/docs/lips/environments.html index b2d676ec..ab1027cc 100644 --- a/docs/lips/environments.html +++ b/docs/lips/environments.html @@ -4,7 +4,7 @@ Environments | LIPS Scheme - + @@ -39,8 +39,8 @@

S specification in a form of a function scheme-report-environment.

You can use this function in LIPS with version 5 and 7 to get R5RS or R7RS.

-

NOTE: that some of the functions from R5RS may have features of R7RS since -some of them got additional arguments. RnRS is backward compatible.

+
info

Note that some of the functions from R5RS may have features of R7RS since +some of them got additional arguments. RnRS is backward compatible.

You can use this function with eval or let-env:

(let ((env (scheme-report-environment 7)))
   (let-env env
diff --git a/docs/lips/extension.html b/docs/lips/extension.html
index c4822729..01c65243 100644
--- a/docs/lips/extension.html
+++ b/docs/lips/extension.html
@@ -4,7 +4,7 @@
 
 
 Extending LIPS | LIPS Scheme
-
+
 
 
 
@@ -99,7 +99,7 @@ 

Syntax ext
(lips.parse "##10")
 ;; ==> #((list 10 10))
 
-

NOTE: The lips.parse function return array/vector of parsed expressions.

+
info

The lips.parse function return array/vector of parsed expressions.

There are 3 types of syntax extensions SPLICE, LITERAL, and SYMBOL. You define them using constants defined in lips.specials object.

    @@ -220,8 +220,8 @@

    Accessing p ;; ==> &(:token "#:num" :col 10 :offset 274 :line 12) ;; ==> (12 13)

-

NOTE: The provided output will be exactly the same, when the code will be put into a single file -and executed.

+
info

The provided output will be exactly the same, when the code will be put into a single file +and executed.

Standard input​

In syntax extensions current-input-port points into the parser stream. So you can implement your own parser logic. The best way to implement custom syntax extension (that works similar to diff --git a/docs/lips/functional-helpers.html b/docs/lips/functional-helpers.html index d5ac1d6f..8c8357cf 100644 --- a/docs/lips/functional-helpers.html +++ b/docs/lips/functional-helpers.html @@ -4,7 +4,7 @@ Functional and other utils | LIPS Scheme - + @@ -155,8 +155,8 @@

always and o (finally (console.timeEnd ,label))))))

-

NOTE #:result expression is auto gensym as one of -builtin syntax extensions.

+
info

#:result expression is auto gensym as one of +builtin syntax extensions.

We can use this code to make sure that the function has been executed only once:

(define (expensive value)
   (new Promise (lambda (resolve)
@@ -211,7 +211,7 @@ 

pipefolding​

LIPS define function reduce that is an alias to standard Scheme procedure fold-right and fold that is the same as fold-left. Both procedures works similarly. The take a procedure and a list and reduce it into a single value.

-

NOTE the reduce works differently than in JavaScript, the callback function get accumulator in last argument.

+
info

The reduce works differently than in JavaScript, the callback function get accumulator in last argument.

(reduce cons '() '(1 2 3 4 5))
 ;; ==> (5 4 3 2 1)
 
@@ -235,8 +235,8 @@

folding '("foo" "bar" "baz" "quuz")) ;; ==> (1 "foo" 2 "bar" 3 "baz" 4 "quuz")

-

NOTE: here we use cons to create a list, cons construct the list in reverse order so reduce -start from first element and fold is reversed:

+
info

Here we use cons to create a list, cons construct the list in reverse order so reduce +start from first element and fold is reversed:

(reduce (lambda (item acc)
           (print acc)
           (cons item acc))
diff --git a/docs/lips/intro.html b/docs/lips/intro.html
index 87a3096d..7a18430c 100644
--- a/docs/lips/intro.html
+++ b/docs/lips/intro.html
@@ -4,7 +4,7 @@
 
 
 Core features | LIPS Scheme
-
+
 
 
 
@@ -171,7 +171,7 @@ 

Typechecking (typecheck-number "let" i "bigint")) ;; ==> Expecting bigint got complex in expression `let`

-

NOTE: In LIPS all integers are BigInts.

+
info

In LIPS all integers are BigInts.

The last typecking function is typecheck-args that check if all arguments are of same type.

(let ((number '(1 10 1/2 10+10i)))
   (typecheck-args "number" "let" number))
@@ -338,15 +338,15 @@ 
(document.querySelector "body")
-

NOTE the only time when you still need . function is when you want to get the property of -object returned by expression.

+
info

The only time when you still need . function is when you want to get the property of +object returned by expression.

(let ((style (. (document.querySelector "body") 'style)))
   (set! style.background "red"))
 

Here we get a style object from the DOM node without sorting the reference to the DOM node.

-

NOTE because dot notation in symbols is not special syntax you can use code like this:

+
info

Because dot notation in symbols is not special syntax you can use code like this:

(let ((x #(1 2 3)))
   (print x.0)
   (print x.1)
@@ -381,7 +381,7 @@ 

Callbacks["1", "2", "3"].map(parseInt) // ==> [1, NaN, NaN]

-
info

the values in JavaScript are different because they have different representation in LIPS.

+
info

The values in JavaScript are different because they have different representation in LIPS.

To fix the issue you can define lambda with single argument:

(--> #("1" "2" "3") (map (lambda (str) (string->number str))))
@@ -457,8 +457,8 @@ 

Object liter (write jack) ;; ==> &(:name "Jack" :age 22)

-

NOTE: because of the construction of syntax extensions and -quasiquote, you can't splice a list inside object literals:

+
info

Because of the construction of syntax extensions and +quasiquote, you can't splice a list inside object literals:

(let ((args (list ':foo "lorem" ':bar "ipsum")))
   `&(,@args))
 ;; ==> pair (unquote-splicing args) is not a symbol!
@@ -484,8 +484,8 @@ 

Object liter (create-object :foo "lorem" :bar "ipsum") ;; ==> &(:foo "lorem" :bar "ipsum")

-

NOTE: this example macro works the same object is it's not that useful, but you can create -more complex code where you will be able to generate object literals with splicing.

+
info

This example macro works the same object is it's not that useful, but you can create +more complex code where you will be able to generate object literals with splicing.

Object literal also have shorthad notation:

(let ((obj &(:x :y)))
   (write obj))
@@ -538,7 +538,7 @@ 

Promise qu (print (await promise))) ;; ==> Scheme is Super Fun

-

NOTE Inside then lambda promises are still automagically resolved.

+
info

Inside then lambda promises are still automagically resolved.

(--> '>(Promise.resolve "hello")
        (then (lambda (value)
                (print (string-append value " " (Promise.resolve "LIPS"))))))
@@ -593,7 +593,7 @@ 

Exceptions;; ==> after error ;; ==> nasty

-

NOTE the order of execution is not expected, but it may change in the future.

+
info

The order of execution is not expected, but it may change in the future.

LIPS also define R7RS guard procedure that is just a macro that use try..catch behind the scene:

(guard (e ((list? e) (print (string-append "Error: " (car e)))))
        (raise '("error")))
@@ -627,8 +627,8 @@ 

(Array.from #(1/2 1/3 1/4 1/5)) ;; ==> #(0.5 0.3333333333333333 0.25 0.2)

-

NOTE: be careful when using iterator protocol because any function side Scheme can return a promise. If you would change -quoted object literal `&() with longhand object you will get an error because object is async.

+
info

Be careful when using iterator protocol because any function side Scheme can return a promise. If you would change +quoted object literal `&() with longhand object you will get an error because object is async.

You can abstract the use of iteration protocol with a macro, but to have real yield keyword like syntax you need call/cc.

You can also define generators inside JavaScript using self.eval (JavaScript global eval):

@@ -741,8 +741,8 @@

Binary compi

Will create file.xcb in same directory. For smaller files it make not have a difference when loading .xcb or .scm files.

-

NOTE: directives #!fold-case and #!no-fold-case work only inside the parser and they are -treated as comments, so you can't compile the code that have those directives.

+
info

Directives #!fold-case and #!no-fold-case work only inside the parser and they are +treated as comments, so you can't compile the code that have those directives.

loading SRFI​

In LIPS, you can use (load) with path absolute or relative to the directory of the executed LIPS file. But you can use special syntax that indicate the root directory of the LIPS Scheme.

diff --git a/docs/lips/reflection.html b/docs/lips/reflection.html index f24c4d4d..5a0c2ea5 100644 --- a/docs/lips/reflection.html +++ b/docs/lips/reflection.html @@ -4,7 +4,7 @@ Reflection | LIPS Scheme - + diff --git a/docs/lips/sxml.html b/docs/lips/sxml.html index 997f0f8c..735b6cf5 100644 --- a/docs/lips/sxml.html +++ b/docs/lips/sxml.html @@ -4,7 +4,7 @@ SXML (e.g. for React) | LIPS Scheme - + diff --git a/docs/scheme-intro/continuations.html b/docs/scheme-intro/continuations.html index 8c457255..f7f8a627 100644 --- a/docs/scheme-intro/continuations.html +++ b/docs/scheme-intro/continuations.html @@ -4,7 +4,7 @@ Continuations | LIPS Scheme - + diff --git a/docs/scheme-intro/core.html b/docs/scheme-intro/core.html index 279f233e..f67aa75f 100644 --- a/docs/scheme-intro/core.html +++ b/docs/scheme-intro/core.html @@ -4,7 +4,7 @@ Core of Scheme | LIPS Scheme - + diff --git a/docs/scheme-intro/data-types.html b/docs/scheme-intro/data-types.html index beefd813..7805e386 100644 --- a/docs/scheme-intro/data-types.html +++ b/docs/scheme-intro/data-types.html @@ -4,7 +4,7 @@ Data Types | LIPS Scheme - + diff --git a/docs/scheme-intro/input-output.html b/docs/scheme-intro/input-output.html index 0b5b5e05..4a8d87ce 100644 --- a/docs/scheme-intro/input-output.html +++ b/docs/scheme-intro/input-output.html @@ -4,7 +4,7 @@ Input and Output | LIPS Scheme - + diff --git a/docs/scheme-intro/macros.html b/docs/scheme-intro/macros.html index 4f289c1a..3b0274e1 100644 --- a/docs/scheme-intro/macros.html +++ b/docs/scheme-intro/macros.html @@ -4,7 +4,7 @@ Macros | LIPS Scheme - + @@ -140,9 +140,9 @@

Recursive M
(alist "foo" 10 "bar" 20 "baz" 30)
 ;; ==> (("foo" . 10) ("bar" . 20) ("baz" . 30))
 
-

Note recursive call is inside quote and only argument is unquoted. This is required since +

info

Recursive call is inside quote and only argument is unquoted. This is required since recursive macro call needs to appear in the expansion. If you call macro recursively and don't return -macro call as output list you will end up in ifninite recursive call.

+macro call as output list you will end up in ifninite recursive call.

You can see the macro will expand with macroexpand:

(macroexpand (alist "foo" 10 "bar" 20 "baz" 30))
 ;; ==> (cons (cons "foo" 10) (cons (cons "bar" 20) (cons (cons "baz" 30) ())))
@@ -391,8 +391,8 @@ 

Re

Anaphoric Hygienic Macros​

By default Scheme syntax-rules macros don't allow creating anaphoric macros like lisp macro do. But with SRFI-139 you can implement such macros.

-

Note: that not every scheme implementation support this SRFI.

+
info

Note that not every scheme implementation support this SRFI.

Here is example of awhen anaphoric macro that use this SRFI:

(define-syntax-parameter it (syntax-rules () ((_) (syntax-error "Use outside aif"))))
diff --git a/docs/scheme-intro/next-step.html b/docs/scheme-intro/next-step.html
index 4a9b4ba3..0a13fb1f 100644
--- a/docs/scheme-intro/next-step.html
+++ b/docs/scheme-intro/next-step.html
@@ -4,7 +4,7 @@
 
 
 What Next? | LIPS Scheme
-
+
 
 
 
@@ -50,8 +50,8 @@ 

Lisp Macros

Scheme hygienic macros​

-

NOTE: Unfortunately, there are no good books about Scheme hygienic macros. But you can read -those documents:

+
info

Unfortunately, there are no good books about Scheme hygienic macros. But you can read +those documents: