mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 03:40:34 +02:00
Move `define-inlinable' into the default namespace
* module/ice-9/boot-9.scm (define-inlineable): Moved here from SRFI-9. * module/srfi/srfi-9 (define-inlinable): Removed here. * doc/ref/api-procedures.texi (Inlinable Procedures): Add subsection about `define-inlinable'.
This commit is contained in:
parent
6ebecdeb7d
commit
165b10ddfa
3 changed files with 64 additions and 33 deletions
|
@ -1,6 +1,6 @@
|
||||||
@c -*-texinfo-*-
|
@c -*-texinfo-*-
|
||||||
@c This is part of the GNU Guile Reference Manual.
|
@c This is part of the GNU Guile Reference Manual.
|
||||||
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010
|
@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010, 2011
|
||||||
@c Free Software Foundation, Inc.
|
@c Free Software Foundation, Inc.
|
||||||
@c See the file guile.texi for copying conditions.
|
@c See the file guile.texi for copying conditions.
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
||||||
* Higher-Order Functions:: Function that take or return functions.
|
* Higher-Order Functions:: Function that take or return functions.
|
||||||
* Procedure Properties:: Procedure properties and meta-information.
|
* Procedure Properties:: Procedure properties and meta-information.
|
||||||
* Procedures with Setters:: Procedures with setters.
|
* Procedures with Setters:: Procedures with setters.
|
||||||
|
* Inlinable Procedures:: Procedures that can be inlined.
|
||||||
@end menu
|
@end menu
|
||||||
|
|
||||||
|
|
||||||
|
@ -797,6 +798,32 @@ Return the setter of @var{proc}, which must be either a procedure with
|
||||||
setter or an operator struct.
|
setter or an operator struct.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@node Inlinable Procedures
|
||||||
|
@subsection Inlinable Procedures
|
||||||
|
|
||||||
|
You can define an @dfn{inlinable procedure} by using
|
||||||
|
@code{define-inlinable} instead of @code{define}. An inlinable
|
||||||
|
procedure behaves the same as a regular procedure, but direct calls will
|
||||||
|
result in the procedure body being inlined into the caller.
|
||||||
|
|
||||||
|
Procedures defined with @code{define-inlinable} are @emph{always}
|
||||||
|
inlined, at all direct call sites. This eliminates function call
|
||||||
|
overhead at the expense of an increase in code size. Additionally, the
|
||||||
|
caller will not transparently use the new definition if the inline
|
||||||
|
procedure is redefined. It is not possible to trace an inlined
|
||||||
|
procedures or install a breakpoint in it (@pxref{Traps}). For these
|
||||||
|
reasons, you should not make a procedure inlinable unless it
|
||||||
|
demonstrably improves performance in a crucial way.
|
||||||
|
|
||||||
|
In general, only small procedures should be considered for inlining, as
|
||||||
|
making large procedures inlinable will probably result in an increase in
|
||||||
|
code size. Additionally, the elimination of the call overhead rarely
|
||||||
|
matters for for large procedures.
|
||||||
|
|
||||||
|
@deffn {Scheme Syntax} define-inlinable (name parameter ...) body ...
|
||||||
|
Define @var{name} as a procedure with parameters @var{parameter}s and
|
||||||
|
body @var{body}.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@c Local Variables:
|
@c Local Variables:
|
||||||
@c TeX-master: "guile.texi"
|
@c TeX-master: "guile.texi"
|
||||||
|
|
|
@ -3496,6 +3496,42 @@ module '(ice-9 q) '(make-q q-length))}."
|
||||||
(syntax-violation 'require-extension "Not a recognized extension type"
|
(syntax-violation 'require-extension "Not a recognized extension type"
|
||||||
x)))))
|
x)))))
|
||||||
|
|
||||||
|
|
||||||
|
;;; Defining transparently inlinable procedures
|
||||||
|
;;;
|
||||||
|
|
||||||
|
(define-syntax define-inlinable
|
||||||
|
;; Define a macro and a procedure such that direct calls are inlined, via
|
||||||
|
;; the macro expansion, whereas references in non-call contexts refer to
|
||||||
|
;; the procedure. Inspired by the `define-integrable' macro by Dybvig et al.
|
||||||
|
(lambda (x)
|
||||||
|
;; Use a space in the prefix to avoid potential -Wunused-toplevel
|
||||||
|
;; warning
|
||||||
|
(define prefix (string->symbol "% "))
|
||||||
|
(define (make-procedure-name name)
|
||||||
|
(datum->syntax name
|
||||||
|
(symbol-append prefix (syntax->datum name)
|
||||||
|
'-procedure)))
|
||||||
|
|
||||||
|
(syntax-case x ()
|
||||||
|
((_ (name formals ...) body ...)
|
||||||
|
(identifier? #'name)
|
||||||
|
(with-syntax ((proc-name (make-procedure-name #'name))
|
||||||
|
((args ...) (generate-temporaries #'(formals ...))))
|
||||||
|
#`(begin
|
||||||
|
(define (proc-name formals ...)
|
||||||
|
body ...)
|
||||||
|
(define-syntax name
|
||||||
|
(lambda (x)
|
||||||
|
(syntax-case x ()
|
||||||
|
((_ args ...)
|
||||||
|
#'((lambda (formals ...)
|
||||||
|
body ...)
|
||||||
|
args ...))
|
||||||
|
(_
|
||||||
|
(identifier? x)
|
||||||
|
#'proc-name))))))))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define using-readline?
|
(define using-readline?
|
||||||
|
|
|
@ -64,38 +64,6 @@
|
||||||
|
|
||||||
(cond-expand-provide (current-module) '(srfi-9))
|
(cond-expand-provide (current-module) '(srfi-9))
|
||||||
|
|
||||||
(define-syntax define-inlinable
|
|
||||||
;; Define a macro and a procedure such that direct calls are inlined, via
|
|
||||||
;; the macro expansion, whereas references in non-call contexts refer to
|
|
||||||
;; the procedure. Inspired by the `define-integrable' macro by Dybvig et al.
|
|
||||||
(lambda (x)
|
|
||||||
;; Use a space in the prefix to avoid potential -Wunused-toplevel
|
|
||||||
;; warning
|
|
||||||
(define prefix (string->symbol "% "))
|
|
||||||
(define (make-procedure-name name)
|
|
||||||
(datum->syntax name
|
|
||||||
(symbol-append prefix (syntax->datum name)
|
|
||||||
'-procedure)))
|
|
||||||
|
|
||||||
(syntax-case x ()
|
|
||||||
((_ (name formals ...) body ...)
|
|
||||||
(identifier? #'name)
|
|
||||||
(with-syntax ((proc-name (make-procedure-name #'name))
|
|
||||||
((args ...) (generate-temporaries #'(formals ...))))
|
|
||||||
#`(begin
|
|
||||||
(define (proc-name formals ...)
|
|
||||||
body ...)
|
|
||||||
(define-syntax name
|
|
||||||
(lambda (x)
|
|
||||||
(syntax-case x ()
|
|
||||||
((_ args ...)
|
|
||||||
#'((lambda (formals ...)
|
|
||||||
body ...)
|
|
||||||
args ...))
|
|
||||||
(_
|
|
||||||
(identifier? x)
|
|
||||||
#'proc-name))))))))))
|
|
||||||
|
|
||||||
(define-syntax define-record-type
|
(define-syntax define-record-type
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(define (field-identifiers field-specs)
|
(define (field-identifiers field-specs)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue