This file is indexed.

/usr/share/guile-gnome-2/gnome/gobject/gclosure.scm is in guile-gnome2-glib 2.16.1-6ubuntu2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
;; guile-gnome
;; Copyright (C) 2001 Martin Baulig <martin@gnome.org>
;; Copyright (C) 2003,2004 Andy Wingo <wingo at pobox dot com>

;; This program is free software; you can redistribute it and/or    
;; modify it under the terms of the GNU General Public License as   
;; published by the Free Software Foundation; either version 2 of   
;; the License, or (at your option) any later version.              
;;                                                                  
;; This program 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 General Public License for more details.                     
;;                                                                  
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, contact:
;;
;; Free Software Foundation           Voice:  +1-617-542-5942
;; 59 Temple Place - Suite 330        Fax:    +1-617-542-2652
;; Boston, MA  02111-1307,  USA       gnu@gnu.org

;;; Commentary:
;; 
;; The GLib type system supports the creation and invocation of
;; ``closures'', objects which can be invoked like procedures. Its
;; infrastructure allows one to pass a Scheme function to C, and have C
;; call into Scheme, and vice versa.
;; 
;; In Scheme, @code{<gclosure>} holds a Scheme procedure, the
;; @code{<gtype>} of its return value, and a list of the
;; @code{<gtype>}'s of its arguments. Closures can be invoked with
;; @code{gclosure-invoke}.
;;
;; However since on the C level, closures do not carry a description of
;; their argument and return types, when we invoke a closure we have to
;; be very explicit about the types involved. For example:
;; 
;; @lisp
;; (gclosure-invoke (make <gclosure>
;;                   #:return-type <gint>
;;                   #:param-types (list <gulong>)
;;                   #:func (lambda (x) (* x x)))
;;                  <gulong>
;;                  (scm->gvalue <gulong> 10))
;; @result{} 100
;; @end lisp
;;; Code:

(define-module (gnome gobject gclosure)
  #:use-module (gnome gobject config)
  #:use-module (gnome gobject utils)
  #:use-module (gnome gobject gtype)
  #:use-module (gnome gobject gvalue)
  #:use-module (oop goops)

  #:export     (<gclosure> gclosure-invoke))

(dynamic-call "scm_init_gnome_gobject_closures"
              (dynamic-link *guile-gnome-gobject-lib-path*))

(define-class-with-docs <gclosure> (<gboxed>)
  "The Scheme representation of a GLib closure: a typed procedure
object that can be passed to other languages." ;; FIXME say something about initargs
  #:gtype-name "GClosure")

;;;
;;; {Instance Allocation and Initialization}
;;;

(define-method (initialize (closure <gclosure>) initargs)
  ;; don't chain up, we do our own init
  (let ((return-type (get-keyword #:return-type initargs #f))
        (param-types (get-keyword #:param-types initargs '()))
        (func (get-keyword #:func initargs #f)))
    (%gclosure-construct closure return-type param-types func)))