Skip to content

JIK STEM navigation

Build · trade · test · learn

Innovate the way…

A social marketplace for software projects.

Find software, services, subscriptions, and specialists; evaluate deliveries, claim source, and learn in the Python-powered Lisp lab.

A little Jik, one idea at a time

Read the code. Follow the idea.

The falling code is a small language tour. Choose an example, explore its result, then try it in Lisp Lab.

Reach Master in JIK to create and edit rain examples for other learners.

native-scope.jik
(define (+ a b) 999)
[(+ 20 22) (#+ 20 22)]
Expected result[999, 42]
01 / 10

Reach the native function

An ordinary name can be shadowed. A leading # looks in the native scope first, so #+ still adds these numbers.

In this runtime, #name falls back to the global scope when no native exists; it skips lexical bindings. The # is a lookup qualifier, not part of the symbol's name.

Try in Lisp Lab
basic-values.jik
[#nil #f #t 42 3.5
 (+ 0.1 0.2)
 "hello" .name 'answer]
Expected result[(), #f, #t, 42, 3.5, 0.3, "hello", .name, answer]
02 / 10

Meet the basic values

Nil, booleans, integers, decimals, strings, keywords and quoted symbols are values you can place in a vector.

The printer writes nil as () and decimals without a suffix: (+ 0.1 0.2) returns 0.3. A quote keeps answer as a symbol instead of looking up a binding.

Try in Lisp Lab
lambda.jik
((lambda [x] (#* x x))
 (#+ 2 3))
Expected result25
03 / 10

Evaluate, then call

A lambda receives evaluated arguments. Here addition produces 5 before the function squares x.

The parameter vector [x] names one argument. #([x] (#* x x)) is the compact form of this lambda.

Try in Lisp Lab
rest-arguments.jik
((lambda [first : rest] [first rest])
 10 20 30)
Expected result[10, [20, 30]]
04 / 10

Collect the remaining arguments

A parameter after : receives all remaining arguments. first gets 10, while rest collects 20 and 30.

This website's runtime represents rest arguments as a vector. An empty rest sequence is [].

Try in Lisp Lab
mutable-bindings.jik
(define score 5)
(set! score (+ score 7))
score
Expected result12
05 / 10

Update an existing cell

define creates a binding; set! updates the existing cell.

declare-value reserves a value name; definitions and function names use separate cells.

Try in Lisp Lab
parallel-sequential.jik
(define x 10)
[(let [[x 2] [y x]] [x y])
 (let* [[x 2] [y x]] [x y])]
Expected result[[2, 10], [2, 2]]
06 / 10

Choose parallel or sequential bindings

let evaluates initializers in the outer scope. let* exposes each new binding to later initializers.

Try in Lisp Lab
recursive-bindings.jik
(letrec [[fact (lambda [n]
  (if (= n 0) 1
      (* n (funcall fact (- n 1)))) )]]
  (funcall fact 5))
Expected result120
07 / 10

Bind a recursive local function

letrec creates the cells before filling them, so a closure can refer to its own binding.

Try in Lisp Lab
named-let.jik
(let count [[n 4] [total 0]]
  (if (= n 0) total
      (count (- n 1) (+ total n))))
Expected result10
08 / 10

Name a local loop

Named let gives the local iteration a function name. A call in tail position reuses the VM invocation loop.

Try in Lisp Lab
conditional-classification.jik
(define (classify value limit)
  (cond [(< value limit) .below]
        [(= value limit) .equal]
        [else .above]))
(classify 8 10)
Expected result.below
09 / 10

Classify with a public boundary

Compare the same two arguments in every branch, and return the keyword selected by the public contract.

and and or short-circuit; nil and f are false, while other values are true.

Try in Lisp Lab
named-function-cells.jik
(define answer 9)
(define (answer x) (+ x 3))
[answer (answer 6) (funcall @answer 7)]
Expected result[9, 9, 10]
10 / 10

Keep function and value names separate

A symbol can have a value binding and a function binding. @answer retrieves the function as a value.

Try in Lisp Lab

Marketplace

Available projects

View all
Requested solutionUnsolved

Continuation Course Workbench

An unsolved, community-preordered project request for visual continuation tracing and exercises.

JIK / Fusion Lisp

JIK language 315+

by Miroslav Bezděk0.01 EUR

Network

People to know

View all

Miroslav Bezděk

JIK language designer and knowledge provider

JIK language, compiler, and VM author.

◉ English · ◉ Čeština
✎ English · ✎ Čeština

Available2 projects

Repository

Knowledge patterns

View all
Growth Free

aegwenia/jik/native-global-lookup

Symbols, namespaces, and # lookup

Keep # outside symbol identity; resolve #name native first and then global, with @ selecting the function namespace.

Unavailable Unlock 0
Initiate0/525
Growth Free

aegwenia/jik/reader-literals

Reader and literal values

Read nil, booleans, integers, decimals, strings, characters, bytes, keywords, symbols, lists, vectors, and maps. Bare t/f are Boolean fallbacks only when ordinary bindings do not shadow them; #t/#f are explicit literals.

Unavailable Unlock 0
Initiate0/525
Frontier Free

aegwenia/jik/definitions-bindings

Definitions and mutable bindings

Create value cells, update an existing cell, and distinguish declaration from definition.

Unavailable Unlock 15
Initiate0/525
Frontier Free

aegwenia/jik/lexical-binding

let, let*, letrec, and named let

Choose parallel, sequential, recursive, or loop-shaped lexical binding without exposing host state.

Unavailable Unlock 30
Initiate0/525
Frontier Free

aegwenia/jik/conditions-logic

Conditions and short-circuit logic

Branch and compose predicates while preserving the value of the selected form.

Unavailable Unlock 45
Initiate0/525
Frontier Free

aegwenia/jik/functions-lambda

Functions, parameters, and rest views

Create closures with fixed/rest parameters; parameters are lexical cells and rest arguments are bounded views.

Unavailable Unlock 60
Initiate0/525