Skip to content

Commit

Permalink
fix repr of anonymous classes #361
Browse files Browse the repository at this point in the history
  • Loading branch information
jcubic committed May 13, 2024
1 parent a5264e6 commit 21955b9
Show file tree
Hide file tree
Showing 12 changed files with 98 additions and 73 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* fix handling of REPL in Emacs (`run-scheme`)
* fix `promise?` predicate
* fix handling of `|1|1` and `|a|b|c|` symbols
* fix repr of anonymous classes [#361](https://github.com/LIPS-scheme/lips/issues/361)

## 1.0.0-beta.19
### Breaking
Expand Down
11 changes: 7 additions & 4 deletions dist/lips.cjs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 7 additions & 4 deletions dist/lips.esm.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions dist/lips.esm.min.js

Large diffs are not rendered by default.

11 changes: 7 additions & 4 deletions dist/lips.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions dist/lips.min.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions dist/std.min.scm

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

60 changes: 33 additions & 27 deletions dist/std.scm

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified dist/std.xcb
Binary file not shown.
2 changes: 1 addition & 1 deletion docs/reference.json

Large diffs are not rendered by default.

60 changes: 33 additions & 27 deletions lib/bootstrap.scm
Original file line number Diff line number Diff line change
Expand Up @@ -982,6 +982,7 @@
"(define-class name parent . body)
Defines a class - JavaScript function constructor with prototype.
parent needs to be class, constructor function, or #null
usage:
Expand All @@ -993,40 +994,45 @@
(newline))))
(define jack (new Person \"Jack\"))
(jack.hi) ; prints \"Jack says hi\""
(let iter ((functions '()) (constructor '()) (lst body))
(if (null? lst)
`(begin
(define ,name ,(if (null? constructor)
`(lambda ())
;; we return this to solve issue when constructor
;; return a promise
;; ref: https://stackoverflow.com/a/50885340/387194
(append (%class-lambda constructor)
(list 'this))))
(set-obj! ,name (Symbol.for "__class__") true)
,(if (not (null? parent))
`(begin
(set-obj! ,name 'prototype (Object.create (. ,parent 'prototype)))
(set-obj! (. ,name 'prototype) 'constructor ,name)))
(set-obj! ,name '__name__ ',name)
,@(map (lambda (fn)
`(set-obj! (. ,name 'prototype)
,(%class-method-name (car fn))
,(%class-lambda fn)))
functions))
(let ((item (car lst)))
(if (eq? (car item) 'constructor)
(iter functions item (cdr lst))
(iter (cons item functions) constructor (cdr lst)))))))
(let ((g:parent (gensym)))
(let iter ((functions '()) (constructor '()) (lst body))
(if (null? lst)
`(begin
(define ,name ,(if (null? constructor)
`(lambda ())
;; we return this to solve issue when constructor
;; return a promise
;; ref: https://stackoverflow.com/a/50885340/387194
(append (%class-lambda constructor)
(list 'this))))
(set-obj! ,name (Symbol.for "__class__") true)
(let ((,g:parent ,parent ))
(if (not (null? ,g:parent))
(begin
(set-obj! ,name 'prototype (Object.create (. ,g:parent 'prototype)))
(set-obj! (. ,name 'prototype) 'constructor ,name))))
(set-obj! ,name '__name__ ',name)
,@(map (lambda (fn)
`(set-obj! (. ,name 'prototype)
,(%class-method-name (car fn))
,(%class-lambda fn)))
functions))
(let ((item (car lst)))
(if (eq? (car item) 'constructor)
(iter functions item (cdr lst))
(iter (cons item functions) constructor (cdr lst))))))))

;; -----------------------------------------------------------------------------
(define-syntax class
(syntax-rules ()
((_)
(error "class: parent required"))
((_ parent body ...)
(let ()
((_ parent-expr body ...)
(let ((parent parent-expr))
(if (not (or (procedure? parent) (eq? parent #null)))
(error "parent class need to be a function or #null"))
(define-class temp parent body ...)
(set-obj! temp "__name__" "anonymous")
temp)))
"(class <parent> body ...)
Expand Down
3 changes: 3 additions & 0 deletions src/lips.js
Original file line number Diff line number Diff line change
Expand Up @@ -3438,6 +3438,9 @@ function toString(obj, quote, skip_cycles, ...pair_args) {
if (type(obj) === 'instance') {
if (is_lambda(constructor) && constructor.__name__) {
name = constructor.__name__.valueOf();
if (typeof name === 'symbol') {
name = name.toString().replace(/^Symbol\((?:#:)?([^\)]+)\)$/, '$1');
}
} else if (!is_native_function(constructor)) {
name = 'instance';
}
Expand Down

0 comments on commit 21955b9

Please sign in to comment.