mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-07 18:30:25 +02:00
* libguile/debug.c (scm_procedure_name): Remove a SCM_CLOSUREP case and some dead code. (scm_procedure_module): Remove. This was introduced a few months ago for the hygienic expander, but now it is no longer needed, as the expander keeps track of this information itself. * libguile/debug.h: Remove scm_procedure_module. * libguile/eval.c: Instead of using tc3 closures, define a "boot closure" applicable smob type, and represent closures with that. The advantage is that after eval.scm is compiled, boot closures take up no address space (besides a smob number) in the runtime, and require no special cases in procedure dispatch. * libguile/eval.h: Remove the internal functions scm_i_call_closure_0 and scm_closure_apply, and the public function scm_closure. * libguile/gc.c (scm_storage_prehistory): No tc3_closure displacement registration. (scm_i_tag_name): Remove closure case, and a dead cclo case. * libguile/vm.c (apply_foreign): * libguile/print.c (iprin1): * libguile/procs.c (scm_procedure_p, scm_procedure_documentation); * libguile/evalext.c (scm_self_evaluating_p): * libguile/goops.c (scm_class_of): Remove tc3_closure/tcs_closure cases. * libguile/hash.c (scm_hasher): * libguile/hooks.c (scm_add_hook_x): Use new scm_i_procedure_arity. * libguile/macros.c (macro_print): Print all macros using the same code. (scm_macro_transformer): Return any procedure, not just programs. * libguile/procprop.h: * libguile/procprop.c (scm_i_procedure_arity): Instead of returning a list that the caller has to parse, have the same prototype as scm_i_program_arity. An incompatible change, but it's an internal function anyway. (scm_procedure_properties, scm_set_procedure_properties) (scm_procedure_property, scm_set_procedure_property): Remove closure cases, and use scm_i_program_arity for arity. * libguile/procs.h (SCM_CLOSUREP, SCM_CLOSCAR, SCM_CODE) (SCM_CLOSURE_NUM_REQUIRED_ARGS, SCM_CLOSURE_HAS_REST_ARGS) (SCM_CLOSURE_BODY, SCM_PROCPROPS, SCM_SETPROCPROPS, SCM_ENV) (SCM_TOP_LEVEL): Remove these macros that pertain to boot closures only. Only eval.c should know abut boot closures. * libguile/procs.c (scm_closure_p): Remove this function. There is a simple stub in deprecated.scm now. (scm_thunk_p): Use scm_i_program_arity. * libguile/tags.h (scm_tc3_closure): Remove. Yay, another tc3 to play with! (scm_tcs_closures): Remove. * libguile/validate.h (SCM_VALIDATE_CLOSURE): Remove. * module/ice-9/deprecated.scm (closure?): Add stub. * module/ice-9/documentation.scm (object-documentation) * module/ice-9/session.scm (help-doc, arity) * module/oop/goops.scm (compute-getters-n-setters) * module/oop/goops/describe.scm (describe) * module/system/repl/describe.scm (display-object, display-type): Remove calls to closure?.
230 lines
7.5 KiB
Scheme
230 lines
7.5 KiB
Scheme
;;;; Copyright (C) 2003, 2005, 2006, 2009 Free Software Foundation, Inc.
|
|
;;;;
|
|
;;;; This library is free software; you can redistribute it and/or
|
|
;;;; modify it under the terms of the GNU Lesser General Public
|
|
;;;; License as published by the Free Software Foundation; either
|
|
;;;; version 3 of the License, or (at your option) any later version.
|
|
;;;;
|
|
;;;; This library is distributed in the hope that it will be useful,
|
|
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
;;;; Lesser General Public License for more details.
|
|
;;;;
|
|
;;;; You should have received a copy of the GNU Lesser General Public
|
|
;;;; License along with this library; if not, write to the Free Software
|
|
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
;;;;
|
|
|
|
;;;; Deprecated definitions.
|
|
|
|
(define substring-move-left! substring-move!)
|
|
(define substring-move-right! substring-move!)
|
|
|
|
;; This method of dynamically linking Guile Extensions is deprecated.
|
|
;; Use `load-extension' explicitly from Scheme code instead.
|
|
|
|
(define (split-c-module-name str)
|
|
(let loop ((rev '())
|
|
(start 0)
|
|
(pos 0)
|
|
(end (string-length str)))
|
|
(cond
|
|
((= pos end)
|
|
(reverse (cons (string->symbol (substring str start pos)) rev)))
|
|
((eq? (string-ref str pos) #\space)
|
|
(loop (cons (string->symbol (substring str start pos)) rev)
|
|
(+ pos 1)
|
|
(+ pos 1)
|
|
end))
|
|
(else
|
|
(loop rev start (+ pos 1) end)))))
|
|
|
|
(define (convert-c-registered-modules dynobj)
|
|
(let ((res (map (lambda (c)
|
|
(list (split-c-module-name (car c)) (cdr c) dynobj))
|
|
(c-registered-modules))))
|
|
(c-clear-registered-modules)
|
|
res))
|
|
|
|
(define registered-modules '())
|
|
|
|
(define (register-modules dynobj)
|
|
(set! registered-modules
|
|
(append! (convert-c-registered-modules dynobj)
|
|
registered-modules)))
|
|
|
|
(define (warn-autoload-deprecation modname)
|
|
(issue-deprecation-warning
|
|
"Autoloading of compiled code modules is deprecated."
|
|
"Write a Scheme file instead that uses `load-extension'.")
|
|
(issue-deprecation-warning
|
|
(simple-format #f "(You just autoloaded module ~S.)" modname)))
|
|
|
|
(define (init-dynamic-module modname)
|
|
;; Register any linked modules which have been registered on the C level
|
|
(register-modules #f)
|
|
(or-map (lambda (modinfo)
|
|
(if (equal? (car modinfo) modname)
|
|
(begin
|
|
(warn-autoload-deprecation modname)
|
|
(set! registered-modules (delq! modinfo registered-modules))
|
|
(let ((mod (resolve-module modname #f)))
|
|
(save-module-excursion
|
|
(lambda ()
|
|
(set-current-module mod)
|
|
(set-module-public-interface! mod mod)
|
|
(dynamic-call (cadr modinfo) (caddr modinfo))
|
|
))
|
|
#t))
|
|
#f))
|
|
registered-modules))
|
|
|
|
(define (dynamic-maybe-call name dynobj)
|
|
(catch #t ; could use false-if-exception here
|
|
(lambda ()
|
|
(dynamic-call name dynobj))
|
|
(lambda args
|
|
#f)))
|
|
|
|
(define (dynamic-maybe-link filename)
|
|
(catch #t ; could use false-if-exception here
|
|
(lambda ()
|
|
(dynamic-link filename))
|
|
(lambda args
|
|
#f)))
|
|
|
|
(define (find-and-link-dynamic-module module-name)
|
|
(define (make-init-name mod-name)
|
|
(string-append "scm_init"
|
|
(list->string (map (lambda (c)
|
|
(if (or (char-alphabetic? c)
|
|
(char-numeric? c))
|
|
c
|
|
#\_))
|
|
(string->list mod-name)))
|
|
"_module"))
|
|
|
|
;; Put the subdirectory for this module in the car of SUBDIR-AND-LIBNAME,
|
|
;; and the `libname' (the name of the module prepended by `lib') in the cdr
|
|
;; field. For example, if MODULE-NAME is the list (inet tcp-ip udp), then
|
|
;; SUBDIR-AND-LIBNAME will be the pair ("inet/tcp-ip" . "libudp").
|
|
(let ((subdir-and-libname
|
|
(let loop ((dirs "")
|
|
(syms module-name))
|
|
(if (null? (cdr syms))
|
|
(cons dirs (string-append "lib" (symbol->string (car syms))))
|
|
(loop (string-append dirs (symbol->string (car syms)) "/")
|
|
(cdr syms)))))
|
|
(init (make-init-name (apply string-append
|
|
(map (lambda (s)
|
|
(string-append "_"
|
|
(symbol->string s)))
|
|
module-name)))))
|
|
(let ((subdir (car subdir-and-libname))
|
|
(libname (cdr subdir-and-libname)))
|
|
|
|
;; Now look in each dir in %LOAD-PATH for `subdir/libfoo.la'. If that
|
|
;; file exists, fetch the dlname from that file and attempt to link
|
|
;; against it. If `subdir/libfoo.la' does not exist, or does not seem
|
|
;; to name any shared library, look for `subdir/libfoo.so' instead and
|
|
;; link against that.
|
|
(let check-dirs ((dir-list %load-path))
|
|
(if (null? dir-list)
|
|
#f
|
|
(let* ((dir (in-vicinity (car dir-list) subdir))
|
|
(sharlib-full
|
|
(or (try-using-libtool-name dir libname)
|
|
(try-using-sharlib-name dir libname))))
|
|
(if (and sharlib-full (file-exists? sharlib-full))
|
|
(link-dynamic-module sharlib-full init)
|
|
(check-dirs (cdr dir-list)))))))))
|
|
|
|
(define (try-using-libtool-name libdir libname)
|
|
(let ((libtool-filename (in-vicinity libdir
|
|
(string-append libname ".la"))))
|
|
(and (file-exists? libtool-filename)
|
|
libtool-filename)))
|
|
|
|
(define (try-using-sharlib-name libdir libname)
|
|
(in-vicinity libdir (string-append libname ".so")))
|
|
|
|
(define (link-dynamic-module filename initname)
|
|
;; Register any linked modules which have been registered on the C level
|
|
(register-modules #f)
|
|
(let ((dynobj (dynamic-link filename)))
|
|
(dynamic-call initname dynobj)
|
|
(register-modules dynobj)))
|
|
|
|
(define (try-module-linked module-name)
|
|
(init-dynamic-module module-name))
|
|
|
|
(define (try-module-dynamic-link module-name)
|
|
(and (find-and-link-dynamic-module module-name)
|
|
(init-dynamic-module module-name)))
|
|
|
|
(define (list* . args)
|
|
(issue-deprecation-warning "'list*' is deprecated. Use 'cons*' instead.")
|
|
(apply cons* args))
|
|
|
|
;; The strange prototype system for uniform arrays has been
|
|
;; deprecated.
|
|
|
|
(define-macro (eval-case . clauses)
|
|
(issue-deprecation-warning
|
|
"`eval-case' is deprecated. Use `eval-when' instead.")
|
|
;; Practically speaking, eval-case only had load-toplevel and else as
|
|
;; conditions.
|
|
(cond
|
|
((assoc-ref clauses '(load-toplevel))
|
|
=> (lambda (exps)
|
|
;; the *unspecified so that non-toplevel definitions will be
|
|
;; caught
|
|
`(begin *unspecified* . ,exps)))
|
|
((assoc-ref clauses 'else)
|
|
=> (lambda (exps)
|
|
`(begin *unspecified* . ,exps)))
|
|
(else
|
|
`(begin))))
|
|
|
|
(read-hash-extend
|
|
#\y
|
|
(lambda (c port)
|
|
(issue-deprecation-warning
|
|
"The `#y' bitvector syntax is deprecated. Use `#*' instead.")
|
|
(let ((x (read port)))
|
|
(cond
|
|
((list? x)
|
|
(list->bitvector
|
|
(map (lambda (x)
|
|
(cond ((zero? x) #f)
|
|
((eqv? x 1) #t)
|
|
(else (error "invalid #y element" x))))
|
|
x)))
|
|
(else
|
|
(error "#y needs to be followed by a list" x))))))
|
|
|
|
(define (unmemoize-expr . args)
|
|
(issue-deprecation-warning
|
|
"`unmemoize-expr' is deprecated. Use `unmemoize-expression' instead.")
|
|
(apply unmemoize-expression args))
|
|
|
|
(define ($asinh z) (asinh z))
|
|
(define ($acosh z) (acosh z))
|
|
(define ($atanh z) (atanh z))
|
|
(define ($sqrt z) (sqrt z))
|
|
(define ($abs z) (abs z))
|
|
(define ($exp z) (exp z))
|
|
(define ($log z) (log z))
|
|
(define ($sin z) (sin z))
|
|
(define ($cos z) (cos z))
|
|
(define ($tan z) (tan z))
|
|
(define ($asin z) (asin z))
|
|
(define ($acos z) (acos z))
|
|
(define ($atan z) (atan z))
|
|
(define ($sinh z) (sinh z))
|
|
(define ($cosh z) (cosh z))
|
|
(define ($tanh z) (tanh z))
|
|
(define (closure? x)
|
|
(issue-deprecation-warning
|
|
"`closure?' is deprecated. Use `procedure?' instead.")
|
|
(procedure? x))
|