⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 describe.scm

📁 MSYS在windows下模拟了一个类unix的终端
💻 SCM
字号:
;;; installed-scm-file;;;; 	Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.;;;; ;;;; 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, 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 software; see the file COPYING.  If not, write to;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,;;;; Boston, MA 02111-1307 USA;;;;;;;; As a special exception, the Free Software Foundation gives permission;;;; for additional uses of the text contained in its release of GUILE.;;;;;;;; The exception is that, if you link the GUILE library with other files;;;; to produce an executable, this does not by itself cause the;;;; resulting executable to be covered by the GNU General Public License.;;;; Your use of that executable is in no way restricted on account of;;;; linking the GUILE library code into it.;;;;;;;; This exception does not however invalidate any other reasons why;;;; the executable file might be covered by the GNU General Public License.;;;;;;;; This exception applies only to the code released by the;;;; Free Software Foundation under the name GUILE.  If you copy;;;; code from other Free Software Foundation releases into a copy of;;;; GUILE, as the General Public License permits, the exception does;;;; not apply to the code that you add in this way.  To avoid misleading;;;; anyone as to the status of such modified files, you must delete;;;; this exception notice from them.;;;;;;;; If you write modifications of your own for GUILE, it is your choice;;;; whether to permit this exception to apply to your modifications.;;;; If you do not wish that, delete this exception notice.;;;; ;;;; This software is a derivative work of other copyrighted softwares; the;;;; copyright notices of these softwares are placed in the file COPYRIGHTS;;;;;;;; This file is based upon describe.stklos from the STk distribution by;;;; Erick Gallesio <eg@unice.fr>.;;;;(define-module (oop goops describe)  :use-module (oop goops)  :use-module (ice-9 session)  :use-module (ice-9 format)  :export (describe))			; Export the describe generic function;;;;;; describe for simple objects;;;(define-method (describe (x <top>))  (format #t "~s is " x)  (cond     ((integer? x)      (format #t "an integer"))     ((real?    x)      (format #t "a real"))     ((complex? x)	(format #t "a complex number"))     ((null?	x)      (format #t "an empty list"))     ((boolean?	x)      (format #t "a boolean value (~s)" (if x 'true 'false)))     ((char?	x)      (format #t "a character, ascii value is ~s" 				(char->integer x)))     ((symbol?	x)      (format #t "a symbol"))     ((list?	x)	(format #t "a list"))     ((pair?    x)	(if (pair? (cdr x))			    (format #t "an improper list")			    (format #t "a pair")))     ((string?	x)	(if (eqv? x "")			    (format #t "an empty string")			    (format #t "a string of length ~s" (string-length x))))     ((vector?  x)   	(if (eqv? x '#())			    (format #t "an empty vector")			    (format #t "a vector of length ~s" (vector-length x))))     ((eof-object? x)	(format #t "the end-of-file object"))     (else	     	(format #t "an unknown object (~s)" x)))  (format #t ".~%")  *unspecified*)(define-method (describe (x <procedure>))  (let ((name (procedure-name x)))    (if name	(format #t "`~s'" name)	(display x))    (display " is ")    (display (if name #\a "an anonymous"))    (display (cond ((closure? x) " procedure")		   ((not (struct? x)) " primitive procedure")		   ((entity? x) " entity")		   (else " operator")))    (display " with ")    (arity x)));;;;;; describe for GOOPS instances;;;(define (safe-class-name class)  (if (slot-bound? class 'name)      (class-name class)      class))(define-method (describe (x <object>))  (format #t "~S is an instance of class ~A~%"	  x (safe-class-name (class-of x)))  ;; print all the instance slots  (format #t "Slots are: ~%")  (for-each (lambda (slot)	      (let ((name (slot-definition-name slot)))		(format #t "     ~S = ~A~%"			name			(if (slot-bound? x name) 			    (format #f "~S" (slot-ref x name))			    "#<unbound>"))))	    (class-slots (class-of x)))  *unspecified*);;;;;; Describe for classes;;;(define-method (describe (x <class>))  (format #t "~S is a class. It's an instance of ~A~%" 	  (safe-class-name x) (safe-class-name (class-of x)))    ;; Super classes   (format #t "Superclasses are:~%")  (for-each (lambda (class) (format #t "    ~A~%" (safe-class-name class)))       (class-direct-supers x))  ;; Direct slots  (let ((slots (class-direct-slots x)))    (if (null? slots) 	(format #t "(No direct slot)~%")	(begin	  (format #t "Directs slots are:~%")	  (for-each (lambda (s) 		      (format #t "    ~A~%" (slot-definition-name s)))		    slots))))   ;; Direct subclasses  (let ((classes (class-direct-subclasses x)))    (if (null? classes)	(format #t "(No direct subclass)~%")	(begin	  (format #t "Directs subclasses are:~%") 	  (for-each (lambda (s) 		      (format #t "    ~A~%" (safe-class-name s)))		    classes))))  ;; CPL  (format #t "Class Precedence List is:~%")  (for-each (lambda (s) (format #t "    ~A~%" (safe-class-name s))) 	    (class-precedence-list x))  ;; Direct Methods  (let ((methods (class-direct-methods x)))    (if (null? methods)	(format #t "(No direct method)~%")	(begin	  (format #t "Class direct methods are:~%")	  (for-each describe methods))));  (format #t "~%Field Initializers ~%    ");  (write (slot-ref x 'initializers)) (newline);  (format #t "~%Getters and Setters~%    ");  (write (slot-ref x 'getters-n-setters)) (newline));;;;;; Describe for generic functions;;;(define-method (describe (x <generic>))  (let ((name    (generic-function-name x))	(methods (generic-function-methods x)))    ;; Title    (format #t "~S is a generic function. It's an instance of ~A.~%" 	    name (safe-class-name (class-of x)))    ;; Methods    (if (null? methods)	(format #t "(No method defined for ~S)~%" name)	(begin	  (format #t "Methods defined for ~S~%" name)	  (for-each (lambda (x) (describe x #t)) methods)))));;;;;; Describe for methods;;;(define-method (describe (x <method>) . omit-generic)  (letrec ((print-args (lambda (args)			 ;; take care of dotted arg lists			 (cond ((null? args) (newline))			       ((pair? args)				(display #\space)				(display (safe-class-name (car args)))				(print-args (cdr args)))			       (else				(display #\space)				(display (safe-class-name args))				(newline))))))    ;; Title    (format #t "    Method ~A~%" x)        ;; Associated generic    (if (null? omit-generic)      (let ((gf (method-generic-function x)))	(if gf	    (format #t "\t     Generic: ~A~%" (generic-function-name gf))	    (format #t "\t(No generic)~%"))))    ;; GF specializers    (format #t "\tSpecializers:")    (print-args (method-specializers x))))(provide "describe")

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -