Basics of Scheme

Descrition del contenete del págine

Conversion de old BASIC-programas a Scheme por aprender lu elementari de ti-ci lingue.

Etiquettes:

3D Plot

; 3D Plot

; Original version in BASIC:
;   3-D Plot (by Mark Bramhall), 1978.
;   Creative Computing (Morristown, New Jersey, USA), ca. 1980.

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written in 2025-11-30/12-03.
;
; Last modified: 20251205T0113+0100.

(module 3d-plot)

(define (move-cursor-home)
    (display "\x1B[H"))

(define (clear-screen)
    (display "\x1B[2J")
    (move-cursor-home))

(define (display-credits)
    (display "3D Plot\n\n")
    (display "Original version in BASIC:\n")
    (display "  Creative computing (Morristown, New Jersey, USA), ca. 1980.\n\n")
    (display "This version in Scheme (Bigloo)\n")
    (display "  Copyright (c) 2025, Marcos Cruz (programandala.net)\n")
    (display "  SPDX-License-Identifier: Fair\n\n")
    (display "Press Enter to start the program. ")
    (read-line))

(define (a z)
    (* 30 (exp (/ (* (- z) z) 100))))

(define (draw)
    (define l 0)
    (define z 0)
    (define y1 0)
    (define line-width 56)
    (define line (make-string line-width #\space))
    (do ((x -30.0 (+ x 1.5))) ((> x 30.0))
        (set! l 0)
        (set! y1 (* 5 (floor (/ (sqrt (- 900 (* x x))) 5))))
        (do ((y y1 (- y 5))) ((< y (- y1)))
            (set! z (floor (- (+ 25 (a (sqrt (+ (* x x) (* y y))))) (* 0.7 y))))
            (when (> z l)
                (set! l z)
                (string-set! line (inexact->exact (truncate z)) #\*)))
        (display line)
        (newline)
        (string-fill! line #\space)))

(clear-screen)
(display-credits)
(clear-screen)
(draw)

Bunny

; Bunny

; Original version in BASIC:
;   Creative Computing (Morristown, New Jersey, USA), ca. 1980.

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written on 2025-12-04.
;
; Last modified 20251224T1229+0100.

(module bunny)

(define (move-cursor-home)
    (display "\x1B[H"))

(define (clear-screen)
    (display "\x1B[2J")
    (move-cursor-home))

(define (print-credits)
    (display "Bunny\n\n")
    (display "Original version in BASIC:\n")
    (display "    Creative Computing (Morristown, New Jersey, USA), 1978.\n\n")
    (display "This version in Scheme (Bigloo):\n")
    (display "    Copyright (c) 2025, Marcos Cruz (programandala.net)\n")
    (display "    SPDX-License-Identifier: Fair\n\n")
    (display "Press Enter to start the program.\n")
    (read-line))

(define WIDTH 53)

(define line (make-string WIDTH #\space))

(define letters (list #\B #\U #\N #\N #\Y))

(define EOL 127) ; end of line identifier

(define DATA (list
    1 2 EOL 0 2 45 50 EOL 0 5 43 52 EOL 0 7 41 52 EOL
    1 9 37 50 EOL 2 11 36 50 EOL 3 13 34 49 EOL 4 14
    32 48 EOL 5 15 31 47 EOL 6 16 30 45 EOL 7 17 29 44
    EOL 8 19 28 43 EOL 9 20 27 41 EOL 10 21 26 40 EOL
    11 22 25 38 EOL 12 22 24 36 EOL 13 34 EOL 14 33 EOL
    15 31 EOL 17 29 EOL 18 27 EOL 19 26 EOL 16 28 EOL
    13 30 EOL 11 31 EOL 10 32 EOL 8 33 EOL 7 34 EOL 6
    13 16 34 EOL 5 12 16 35 EOL 4 12 16 35 EOL 3 12 15
    35 EOL 2 35 EOL 1 35 EOL 2 34 EOL 3 34 EOL 4 33
    EOL 6 33 EOL 10 32 34 34 EOL 14 17 19 25 28 31 35
    35 EOL 15 19 23 30 36 36 EOL 14 18 21 21 24 30 37 37
    EOL 13 18 23 29 33 38 EOL 12 29 31 33 EOL 11 13 17
    17 19 19 22 22 24 31 EOL 10 11 17 18 22 22 24 24 29
    29 EOL 22 23 26 29 EOL 27 29 EOL 28 29 EOL))

(define (string-with-replaced-char s position new-char)
    (call-with-output-string
        (lambda (out)
            (display (substring s 0 position) out)
            (display new-char out)
            (display (substring s (+ position 1) (string-length s)) out))))

(define (letter column)
    (list-ref letters (modulo column (length letters))))

(define (display-line)
    (display line)
    (newline)
    (string-fill! line #\space))

(define (draw)
    (let loop ((data-index 0))
        (let ((first-column (list-ref DATA data-index)))
            (if (= first-column EOL)
                (display-line)
                (begin
                    (set! data-index (+ data-index 1))
                    (let ((last-column (list-ref DATA data-index)))
                        (do ((column first-column (+ column 1))) ((>= column (+ last-column 1)))
                            (set! line (string-with-replaced-char line column (letter column)))))))
            (when (< data-index (- (length DATA) 1))
                (loop (+ data-index 1))))))

(clear-screen)
(print-credits)
(clear-screen)
(draw)

Diamond

; Diamond

; Original version in BASIC:
;   Example included in Vintage BASIC 1.0.3.
;   http://www.vintage-basic.net

; This version in Scheme (Bigloo):
;   Copyright (c) 2024, 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written on 2024-12-06, 2025-11-29/30.
;
; Last modified 20251205T0113+0100.

(module diamond)

(define lines 17)

(do ((i 1 (+ i 1)))
    ((> i (+ (/ lines 2) 1)))
    (do ((j 1 (+ j 1)))
        ((> j (+ (- (/ (+ lines 1) 2) i) 1)))
        (display " "))
    (do ((j 1 (+ j 1)))
        ((> j (- (* i 2) 1)))
        (display "*"))
    (newline))

(do ((i 1 (+ i 1)))
    ((>= i (/ lines 2)))
    (do ((j 1 (+ j 1)))
        ((> j (+ i 1)))
        (display " "))
    (do ((j 1 (+ j 1)))
        ((> j (- (* (- (/ (+ lines 1) 2) i) 2) 1)))
        (display "*"))
    (newline))

Math

; Math

; Original version in BASIC:
;   Example included in Vintage BASIC 1.0.3.
;   http://www.vintage-basic.net

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written on 2025-12-04.
;
; Last modified 20251224T1230+0100.

(module math)

(define (accept-string prompt)
    (display prompt)
    (read-line))

(define (accept-number prompt)
    (let ((input (accept-string prompt)))
        (let ((number (string->number input)))
            (if number
                number
                (begin
                    (display "Number expected.")
                    (newline)
                    (accept-number prompt))))))

(define (show basic-function scheme-procedure n result)
    (display
      (format "~a(~d) -> (~a ~d) -> ~d" basic-function n scheme-procedure n result))
    (newline))

(define (sign n)
    (cond
        ((< n 0) -1)
        ((> n 0) 1)
        (else 0)))

(define n (accept-number "Enter a number: "))

(show "ABS" "abs" n (abs n))
(show "ATN" "atan" n (atan n))
(show "COS" "cos" n (cos n))
(show "EXP" "exp" n (exp n))
(show "INT" "truncate" n (truncate n))
(show "LOG" "log" n (log n))
(show "SGN" "ad-hoc:sign" n (sign n))
(show "SQR" "sqrt" n (sqrt n))
(show "TAN" "tan" n (tan n))

Name

; Name

; Original version in BASIC:
;   Example included in Vintage BASIC 1.0.3.
;   http://www.vintage-basic.net

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written in 2025-12-03/04.
;
; Last modified 20251224T1231+0100.

(module name)

(define (accept-string prompt)
    (display prompt)
    (read-line))

(define (accept-integer prompt)
    (let ((input (accept-string prompt)))
        (let ((number (string->number input)))
            (if number
                (truncate number)
                (begin
                    (display "Number expected.")
                    (newline)
                    (accept-integer prompt))))))

(let ((name (accept-string "What is your name? ")))
    (let ((times (accept-integer "Enter a number: ")))
        (do ((i 0 (+ i 1))) ((>= i times))
            (display (format "Hello, ~a!" name))
            (newline))))

Sine Wave

; Sine Wave

; Original version in BASIC:
;   Anonymous, 1978.
;   Creative Computing's BASIC Games.
;   - https://www.atariarchives.org/basicgames/showpage.php?page=146
;   - http://vintage-basic.net/games.html
;   - http://vintage-basic.net/bcg/sinewave.bas
;   - http://www.retroarchive.org/cpm/games/ccgames.zip

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written in 2025-12-02/03.
;
; Last modified 20251223T1811+0100.

(module sine-wave)

(define (move-cursor-home)
    (display "\x1B[H"))

(define (clear-screen)
    (display "\x1B[2J")
    (move-cursor-home))

(define (display-credits)
    (clear-screen)
    (display "Sine Wave\n\n")
    (display "Original version in BASIC:\n")
    (display "  Creative Computing (Morristown, New Jersey, USA), ca. 1980.\n\n")
    (display "This version in Scheme (Bigloo):\n")
    (display "  Copyright (c) 2025, Marcos Cruz (programandala.net)\n")
    (display "  SPDX-License-Identifier: Fair\n\n")
    (display "Press Enter to start the program. ")
    (read-line))

(define word (vector "" ""))

(define (get-words)
    (define order (vector "first" "second"))
    (clear-screen)
    (do ((w 0 (+ w 1))) ((>= w 2))
        (display (format "Enter the ~a word: " (vector-ref order w)))
        (vector-set! word w (read-line))))

(define (boolean->integer b)
  (cadr (assq b '((#t 1) (#f 0)))))

(define (exact-floor n)
    (inexact->exact (truncate n)))

(define (draw)
    (let ((even #f))
        (do ((a 0.0 (+ a 0.25))) ((>= a 40.25))
            (display (make-string (exact-floor (+ (* (sin a) 25) 26)) #\space))
            (display (vector-ref word (boolean->integer even)))
            (newline)
            (set! even (not even)))))

(clear-screen)
(display-credits)
(get-words)
(newline)
(draw)

Stars

; Stars

; Original version in BASIC:
;   Example included in Vintage BASIC 1.0.3.
;   http://www.vintage-basic.net

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written on 2025-12-04.
;
; Last modified 20251224T1231+0100.

(module stars)

(define (accept-string prompt)
    (display prompt)
    (read-line))

(define (accept-integer prompt)
    (let ((input (accept-string prompt)))
        (let ((number (string->number input)))
            (if number
                (truncate number)
                (begin
                    (display "Number expected.")
                    (newline)
                    (accept-integer prompt))))))

(define (first x) (car x))

(define (rest x) (cdr x))

(define (string-in-list-ci? a-string a-list)
    (cond
        ((null? a-list) #f)
        ((string-ci=? a-string (first a-list)) #t)
        (else (string-in-list-ci? a-string (rest a-list)))))

(define (yes? prompt)
    (let ((input (accept-string prompt)))
        (string-in-list-ci? input (list "ok" "y" "yeah" "yes"))))

(let ((name (accept-string "What is your name? ")))
    (display "Hello, ")
    (display name)
    (display ".")
    (newline))

(define (run)
    (let ((number (accept-integer "How many stars do you want? ")))
        (display (make-string number #\*))
        (newline))
    (when (yes? "Do you want more stars? ")
        (run)))

(run)

Strings

; Strings

; Original version in BASIC:
;   Example included in Vintage BASIC 1.0.3.
;   http://www.vintage-basic.net

; This version in Scheme (Bigloo):
;   Copyright (c) 2025, Marcos Cruz (programandala.net)
;   SPDX-License-Identifier: Fair
;
; Written on 2025-12-05.
;
; Last modified 20251224T1216+0100.

(module strings)

(define (accept-string prompt)
    (display prompt)
    (read-line))

(define (accept-integer prompt)
    (let ((input (accept-string prompt)))
        (let ((number (string->number input)))
            (if number
                (truncate number)
                (begin
                    (display "Number expected.")
                    (newline)
                    (accept-integer prompt))))))

(define s (accept-string "Enter a string: "))
(define n (accept-integer "Enter a number: "))

(display
    (format
        "ASC(\"~s\") --> (char->integer (car (string->list \"~s\"))) --> ~d\n"
        s s (char->integer (car (string->list s)))))

(display
    (format
        "CHR$(~d) --> (integer->char ~d) --> \"~s\"\n"
        n n (integer->char n)))

(display
    (format
        "LEFT$(\"~s\", ~d) --> (substring \"~s\" 0 ~d) --> \"~s\"\n"
        s n s n (substring s 0 n)))

(display
    (format
        "MID$(\"~s\", ~d) --> (substring \"~s\" (- ~d 1)) --> \"~s\"\n"
        s n s n (substring s (- n 1))))

(display
    (format
        "MID$(\"~s\", ~d, 3) --> (substring \"~s\" (- ~d 1) (+ (- ~d 1 ) 3)) --> \"~s\"\n"
        s n s n  n (substring s (- n 1) (+ (- n 1) 3))))

(display
    (format
        "RIGHT$(\"~s\", ~d) --> (substring \"~s\" (- (string-length \"~s\") ~d)) --> \"~s\"\n"
        s n s s n (substring s (- (string-length s) n))))

(display
    (format
        "LEN(\"~s\") --> (string-length \"~s\") --> ~d\n"
        s s (string-length s)))

(display
    (format
        "VAL(\"~s\") --> (or (string->number \"~s\") 0) --> ~d\n"
        s s (or (string->number s) 0)))

(display
    (format
        "STR$(~d) --> (number->string ~d) --> \"~s\"\n"
        n n (number->string n)))

(display
    (format
        "SPC(~d) --> (make-string ~d #\\space) --> \"~s\"\n"
        n n (make-string n #\space)))

Págines relatet

Basics off
Metaprojecte pri li projectes «Basics of…».
Basics of 8th
Conversion de old BASIC-programas a 8th por aprender lu elementari de ti-ci lingue.
Basics of Ada
Conversion de old BASIC-programas a Ada por aprender lu elementari de ti-ci lingue.
Basics of Arturo
Conversion de old BASIC-programas a Arturo por aprender lu elementari de ti-ci lingue.
Basics of C#
Conversion de old BASIC-programas a C# por aprender lu elementari de ti-ci lingue.
Basics of C3
Conversion de old BASIC-programas a C3 por aprender lu elementari de ti-ci lingue.
Basics of Chapel
Conversion de old BASIC-programas a Chapel por aprender lu elementari de ti-ci lingue.
Basics of Clojure
Conversion de old BASIC-programas a Clojure por aprender lu elementari de ti-ci lingue.
Basics of Crystal
Conversion de old BASIC-programas a Crystal por aprender lu elementari de ti-ci lingue.
Basics of D
Conversion de old BASIC-programas a D por aprender lu elementari de ti-ci lingue.
Basics of Elixir
Conversion de old BASIC-programas a Elixir por aprender lu elementari de ti-ci lingue.
Basics of F#
Conversion de old BASIC-programas a F# por aprender lu elementari de ti-ci lingue.
Basics of Factor
Conversion de old BASIC-programas a Factor por aprender lu elementari de ti-ci lingue.
Basics of FreeBASIC
Conversion de old BASIC-programas a FreeBASIC por aprender lu elementari de ti-ci lingue.
Basics of Gleam
Conversion de old BASIC-programas a Gleam por aprender lu elementari de ti-ci lingue.
Basics of Go
Conversion de old BASIC-programas a Go por aprender lu elementari de ti-ci lingue.
Basics of Hare
Conversion de old BASIC-programas a Hare por aprender lu elementari de ti-ci lingue.
Basics of Haxe
Conversion de old BASIC-programas a Haxe por aprender lu elementari de ti-ci lingue.
Basics of Icon
Conversion de old BASIC-programas a Icon por aprender lu elementari de ti-ci lingue.
Basics of Io
Conversion de old BASIC-programas a Io por aprender lu elementari de ti-ci lingue.
Basics of Janet
Conversion de old BASIC-programas a Janet por aprender lu elementari de ti-ci lingue.
Basics of Julia
Conversion de old BASIC-programas a Julia por aprender lu elementari de ti-ci lingue.
Basics of Kotlin
Conversion de old BASIC-programas a Kotlin por aprender lu elementari de ti-ci lingue.
Basics of Lobster
Conversion de old BASIC-programas a Lobster por aprender lu elementari de ti-ci lingue.
Basics of Lua
Conversion de old BASIC-programas a Lua por aprender lu elementari de ti-ci lingue.
Basics of Nature
Conversion de old BASIC-programas a Nature por aprender lu elementari de ti-ci lingue.
Basics of Neat
Conversion de old BASIC-programas a Neat por aprender lu elementari de ti-ci lingue.
Basics of Neko
Conversion de old BASIC-programas a Neko por aprender lu elementari de ti-ci lingue.
Basics of Nelua
Conversion de old BASIC-programas a Nelua por aprender lu elementari de ti-ci lingue.
Basics of Nim
Conversion de old BASIC-programas a Nim por aprender lu elementari de ti-ci lingue.
Basics of Nit
Conversion de old BASIC-programas a Nit por aprender lu elementari de ti-ci lingue.
Basics of Oberon-07
Conversion de old BASIC-programas a Oberon-07 por aprender lu elementari de ti-ci lingue.
Basics of OCaml
Conversion de old BASIC-programas a OCaml por aprender lu elementari de ti-ci lingue.
Basics of Odin
Conversion de old BASIC-programas a Odin por aprender lu elementari de ti-ci lingue.
Basics of Pike
Conversion de old BASIC-programas a Pike por aprender lu elementari de ti-ci lingue.
Basics of Pony
Conversion de old BASIC-programas a Pony por aprender lu elementari de ti-ci lingue.
Basics of Python
Conversion de old BASIC-programas a Python por aprender lu elementari de ti-ci lingue.
Basics of Racket
Conversion de old BASIC-programas a Racket por aprender lu elementari de ti-ci lingue.
Basics of Raku
Conversion de old BASIC-programas a Raku por aprender lu elementari de ti-ci lingue.
Basics of Retro
Conversion de old BASIC-programas a Retro por aprender lu elementari de ti-ci lingue.
Basics of Rexx
Conversion de old BASIC-programas a Rexx por aprender lu elementari de ti-ci lingue.
Basics of Ring
Conversion de old BASIC-programas a Ring por aprender lu elementari de ti-ci lingue.
Basics of Rust
Conversion de old BASIC-programas a Rust por aprender lu elementari de ti-ci lingue.
Basics of Scala
Conversion de old BASIC-programas a Scala por aprender lu elementari de ti-ci lingue.
Basics of Styx
Conversion de old BASIC-programas a Styx por aprender lu elementari de ti-ci lingue.
Basics of Swift
Conversion de old BASIC-programas a Swift por aprender lu elementari de ti-ci lingue.
Basics of V
Conversion de old BASIC-programas a V por aprender lu elementari de ti-ci lingue.
Basics of Vala
Conversion de old BASIC-programas a Vala por aprender lu elementari de ti-ci lingue.
Basics of Zig
Conversion de old BASIC-programas a Zig por aprender lu elementari de ti-ci lingue.

Extern ligamentes relatet