Hi everyone. I've written the program attached below and it hangs at writing "after changing (K): ", computer freezes for a moment and then Guile throws the following message:
allocate_stack failed: Can't allocate memory Warning: Unwind-only `stack-overflow' exception; skipping pre-unwind handler. allocate_stack failed: Can't allocate memory Warning: Unwind-only `stack-overflow' exception; skipping pre-unwind handler. Guile version: 2.9.3 OS: Devuan ASCII GNU/Linux Architecture: x86_64 Code: (define-class <temperature> () (k #:init-value 0 #:init-keyword #:k #:accessor kelvin) (c #:accessor celsius #:init-keyword #:c #:allocation #:virtual #:slot-ref (lambda (o) (let ((k (slot-ref o 'k))) (- k 273.15))) #:slot-set! (lambda (o c) (slot-set! o 'c c) (slot-set! o 'k (+ 273.15 c))))) (define (test-virtual-slots) (let ((temp1 (make <temperature> #:k 0))) (display "Absolute zero(K): ") (display (kelvin temp1)) (newline) (display "Absolute zero(C): ") (display (celsius temp1)) (newline) (display "After changing (K): ") (slot-set! temp1 'c 0) (display (kelvin temp1)))) (test-virtual-slots) I couldn't find any mistake, because I'm a new Guile user, so please tell me if I'm doing something wrong. Using an example from the manual (8.5 Illustrating Slot Description) didn't help, because it also throws a different error, not sure if I hadn't copied everything or if there's something fundamentally wrong in GOOPS. The code of the example: (define-class <my-complex> (<number>) ;; True slots use rectangular coordinates (r #:init-value 0 #:accessor real-part #:init-keyword #:r) (i #:init-value 0 #:accessor imag-part #:init-keyword #:i) ;; Virtual slots access do the conversion (m #:accessor magnitude #:init-keyword #:magn #:allocation #:virtual #:slot-ref (lambda (o) (let ((r (slot-ref o ’r)) (i (slot-ref o ’i))) (sqrt (+ (* r r) (* i i))))) #:slot-set! (lambda (o m) (let ((a (slot-ref o ’a))) (slot-set! o ’r (* m (cos a))) (slot-set! o ’i (* m (sin a)))))) (a #:accessor angle #:init-keyword #:angle #:allocation #:virtual #:slot-ref (lambda (o) (atan (slot-ref o ’i) (slot-ref o ’r))) #:slot-set! (lambda(o a) (let ((m (slot-ref o ’m))) (slot-set! o ’r (* m (cos a))) (slot-set! o ’i (* m (sin a))))))) (define c (make <my-complex> #:r 12 #:i 20)) (slot-set! c ’a 3) (display "Real part: ") (display (real-part c)) (newline) (display "Angle: ") (display (angle c)) (newline) (slot-set! c ’i 10) (set! (real-part c) 1) (describe c) The error: ;;; /home/user/Projects/guile/./goops-bug.scm:44:47: warning: possibly unbound variable `#{\x2019;i}#' ;;; /home/user/Projects/guile/./goops-bug.scm:47:28: warning: possibly unbound variable `#{\x2019;a}#' ;;; /home/user/Projects/guile/./goops-bug.scm:48:21: warning: possibly unbound variable `#{\x2019;r}#' ;;; /home/user/Projects/guile/./goops-bug.scm:49:21: warning: possibly unbound variable `#{\x2019;i}#' ;;; /home/user/Projects/guile/./goops-bug.scm:53:24: warning: possibly unbound variable `#{\x2019;i}#' ;;; /home/user/Projects/guile/./goops-bug.scm:53:40: warning: possibly unbound variable `#{\x2019;r}#' ;;; /home/user/Projects/guile/./goops-bug.scm:55:28: warning: possibly unbound variable `#{\x2019;m}#' ;;; /home/user/Projects/guile/./goops-bug.scm:56:21: warning: possibly unbound variable `#{\x2019;r}#' ;;; /home/user/Projects/guile/./goops-bug.scm:57:21: warning: possibly unbound variable `#{\x2019;i}#' ;;; /home/user/Projects/guile/./goops-bug.scm:60:0: warning: possibly unbound variable `#{\x2019;a}#' ;;; /home/user/Projects/guile/./goops-bug.scm:67:0: warning: possibly unbound variable `#{\x2019;i}#' ;;; compiled /home/user/.cache/guile/ccache/3.0-LE-8-4.1/home/user/Projects/guile/goops-bug.scm.go Backtrace: 5 (apply-smob/1 #<catch-closure 55db22ad7780>) In ice-9/boot-9.scm: 702:2 4 (call-with-prompt _ _ #<procedure default-prompt-handle…>) In ice-9/eval.scm: 619:8 3 (_ #(#(#<directory (guile-user) 55db22b9d750>))) In ice-9/boot-9.scm: 2296:4 2 (save-module-excursion _) 3816:12 1 (_) In /home/user/Projects/guile/./goops-bug.scm: 69:0 0 (_) /home/user/Projects/guile/./goops-bug.scm:69:0: Unbound variable: #{\x2019;a}# The line 69 is the last line of the program.