Basics of Scheme

Descripción del contenido de la página

Conversión de antiguos programas de BASIC a Scheme para aprender los rudimentos de este lenguaje.

Etiquetas:

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áginas relacionadas

Basics off
Metaproyecto sobre los proyectos «Basics of…».
Basics of 8th
Conversión de antiguos programas de BASIC a 8th para aprender los rudimentos de este lenguaje.
Basics of Ada
Conversión de antiguos programas de BASIC a Ada para aprender los rudimentos de este lenguaje.
Basics of Arturo
Conversión de antiguos programas de BASIC a Arturo para aprender los rudimentos de este lenguaje.
Basics of C#
Conversión de antiguos programas de BASIC a C# para aprender los rudimentos de este lenguaje.
Basics of C3
Conversión de antiguos programas de BASIC a C3 para aprender los rudimentos de este lenguaje.
Basics of Chapel
Conversión de antiguos programas de BASIC a Chapel para aprender los rudimentos de este lenguaje.
Basics of Clojure
Conversión de antiguos programas de BASIC a Clojure para aprender los rudimentos de este lenguaje.
Basics of Crystal
Conversión de antiguos programas de BASIC a Crystal para aprender los rudimentos de este lenguaje.
Basics of D
Conversión de antiguos programas de BASIC a D para aprender los rudimentos de este lenguaje.
Basics of Elixir
Conversión de antiguos programas de BASIC a Elixir para aprender los rudimentos de este lenguaje.
Basics of F#
Conversión de antiguos programas de BASIC a F# para aprender los rudimentos de este lenguaje.
Basics of Factor
Conversión de antiguos programas de BASIC a Factor para aprender los rudimentos de este lenguaje.
Basics of FreeBASIC
Conversión de antiguos programas de BASIC a FreeBASIC para aprender los rudimentos de este lenguaje.
Basics of Gleam
Conversión de antiguos programas de BASIC a Gleam para aprender los rudimentos de este lenguaje.
Basics of Go
Conversión de antiguos programas de BASIC a Go para aprender los rudimentos de este lenguaje.
Basics of Hare
Conversión de antiguos programas de BASIC a Hare para aprender los rudimentos de este lenguaje.
Basics of Haxe
Conversión de antiguos programas de BASIC a Haxe para aprender los rudimentos de este lenguaje.
Basics of Icon
Conversión de antiguos programas de BASIC a Icon para aprender los rudimentos de este lenguaje.
Basics of Io
Conversión de antiguos programas de BASIC a Io para aprender los rudimentos de este lenguaje.
Basics of Janet
Conversión de antiguos programas de BASIC a Janet para aprender los rudimentos de este lenguaje.
Basics of Julia
Conversión de antiguos programas de BASIC a Julia para aprender los rudimentos de este lenguaje.
Basics of Kotlin
Conversión de antiguos programas de BASIC a Kotlin para aprender los rudimentos de este lenguaje.
Basics of Lobster
Conversión de antiguos programas de BASIC a Lobster para aprender los rudimentos de este lenguaje.
Basics of Lua
Conversión de antiguos programas de BASIC a Lua para aprender los rudimentos de este lenguaje.
Basics of Nature
Conversión de antiguos programas de BASIC a Nature para aprender los rudimentos de este lenguaje.
Basics of Neat
Conversión de antiguos programas de BASIC a Neat para aprender los rudimentos de este lenguaje.
Basics of Neko
Conversión de antiguos programas de BASIC a Neko para aprender los rudimentos de este lenguaje.
Basics of Nelua
Conversión de antiguos programas de BASIC a Nelua para aprender los rudimentos de este lenguaje.
Basics of Nim
Conversión de antiguos programas de BASIC a Nim para aprender los rudimentos de este lenguaje.
Basics of Nit
Conversión de antiguos programas de BASIC a Nit para aprender los rudimentos de este lenguaje.
Basics of Oberon-07
Conversión de antiguos programas de BASIC a Oberon-07 para aprender los rudimentos de este lenguaje.
Basics of OCaml
Conversión de antiguos programas de BASIC a OCaml para aprender los rudimentos de este lenguaje.
Basics of Odin
Conversión de antiguos programas de BASIC a Odin para aprender los rudimentos de este lenguaje.
Basics of Pike
Conversión de antiguos programas de BASIC a Pike para aprender los rudimentos de este lenguaje.
Basics of Pony
Conversión de antiguos programas de BASIC a Pony para aprender los rudimentos de este lenguaje.
Basics of Python
Conversión de antiguos programas de BASIC a Python para aprender los rudimentos de este lenguaje.
Basics of Racket
Conversión de antiguos programas de BASIC a Racket para aprender los rudimentos de este lenguaje.
Basics of Raku
Conversión de antiguos programas de BASIC a Raku para aprender los rudimentos de este lenguaje.
Basics of Retro
Conversión de antiguos programas de BASIC a Retro para aprender los rudimentos de este lenguaje.
Basics of Rexx
Conversión de antiguos programas de BASIC a Rexx para aprender los rudimentos de este lenguaje.
Basics of Ring
Conversión de antiguos programas de BASIC a Ring para aprender los rudimentos de este lenguaje.
Basics of Rust
Conversión de antiguos programas de BASIC a Rust para aprender los rudimentos de este lenguaje.
Basics of Scala
Conversión de antiguos programas de BASIC a Scala para aprender los rudimentos de este lenguaje.
Basics of Styx
Conversión de antiguos programas de BASIC a Styx para aprender los rudimentos de este lenguaje.
Basics of Swift
Conversión de antiguos programas de BASIC a Swift para aprender los rudimentos de este lenguaje.
Basics of V
Conversión de antiguos programas de BASIC a V para aprender los rudimentos de este lenguaje.
Basics of Vala
Conversión de antiguos programas de BASIC a Vala para aprender los rudimentos de este lenguaje.
Basics of Zig
Conversión de antiguos programas de BASIC a Zig para aprender los rudimentos de este lenguaje.

Enlaces externos relacionados