From: Andreas Rottmann Subject: 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'. --- doc/ref/api-procedures.texi | 27 ++++++++++++++++++++++++++- module/ice-9/boot-9.scm | 36 ++++++++++++++++++++++++++++++++++++ module/srfi/srfi-9.scm | 32 -------------------------------- 3 files changed, 62 insertions(+), 33 deletions(-) diff --git a/doc/ref/api-procedures.texi b/doc/ref/api-procedures.texi index 02889c4..4b4870d 100644 --- a/doc/ref/api-procedures.texi +++ b/doc/ref/api-procedures.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Guile Reference Manual. address@hidden Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010 address@hidden Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2009, 2010, 2011 @c Free Software Foundation, Inc. @c See the file guile.texi for copying conditions. @@ -16,6 +16,7 @@ * Higher-Order Functions:: Function that take or return functions. * Procedure Properties:: Procedure properties and meta-information. * Procedures with Setters:: Procedures with setters. +* Inlinable Procedures:: Procedures that can be inlined. @end menu @@ -797,6 +798,30 @@ Return the setter of @var{proc}, which must be either a procedure with setter or an operator struct. @end deffn address@hidden Inlinable Procedures address@hidden Inlinable Procedures + +You can define an ``inlinable procedure'' by using address@hidden 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. + +Making a procedure inlinable eliminates the overhead of the call, but at +the same time means that the caller will not transparently use the new +definition if the inline procedure is redefined. Inlinable procedures +will also not deal nicely with debugging and tracing. Therefore, 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. + address@hidden {Scheme Syntax} define-inlinable (name parameter ...) . body +Define @var{name} as a procedure with parameters @var{parameter}s and +body @var{body}. address@hidden deffn @c Local Variables: @c TeX-master: "guile.texi" diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index 33aa333..327e3fa 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -3497,6 +3497,42 @@ module '(ice-9 q) '(make-q q-length))}." 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? (let ((using-readline? (make-fluid))) diff --git a/module/srfi/srfi-9.scm b/module/srfi/srfi-9.scm index f9449a6..ad9e95d 100644 --- a/module/srfi/srfi-9.scm +++ b/module/srfi/srfi-9.scm @@ -64,38 +64,6 @@ (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 (lambda (x) (define (field-identifiers field-specs) -- tg: (78d1be4..) t/refactor-define-inlinable (depends on: stable-2.0)