home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / sf / usiexp.scm < prev    next >
Text File  |  2000-03-16  |  23KB  |  785 lines

  1. #| -*-Scheme-*-
  2.  
  3. $Id: usiexp.scm,v 4.40 2000/03/16 17:20:06 cph Exp $
  4.  
  5. Copyright (c) 1988-2000 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. |#
  21.  
  22. ;;;; SCode Optimizer: Usual Integrations: Combination Expansions
  23. ;;; package: (scode-optimizer expansion)
  24.  
  25. (declare (usual-integrations)
  26.      (integrate-external "object"))
  27.  
  28. ;;;; Fixed-arity arithmetic primitives
  29.  
  30. (define (make-combination expression block primitive operands)
  31.   (combination/make (and expression (object/scode expression))
  32.             block
  33.             (constant/make #f primitive)
  34.             operands))
  35.  
  36. (define (make-operand-binding expression block operand make-body)
  37.   (combination/make (and expression (object/scode expression))
  38.             block
  39.             (let ((block (block/make block #t '()))
  40.               (name (string->uninterned-symbol "operand")))
  41.               (let ((variable (variable/make&bind! block name)))
  42.             (procedure/make
  43.              #f
  44.              block lambda-tag:let (list variable) '() #f
  45.              (make-body block
  46.                     (reference/make #f block variable)))))
  47.             (list operand)))
  48.  
  49. (define (constant-eq? expression constant)
  50.   (and (constant? expression)
  51.        (eq? (constant/value expression) constant)))
  52.  
  53. (define (unary-arithmetic primitive)
  54.   (lambda (expr operands if-expanded if-not-expanded block)
  55.     (if (and (pair? operands)
  56.          (null? (cdr operands)))
  57.     (if-expanded (make-combination expr block primitive operands))
  58.     (if-not-expanded))))
  59.  
  60. (define (binary-arithmetic primitive)
  61.   (lambda (expr operands if-expanded if-not-expanded block)
  62.     (if (and (pair? operands)
  63.          (pair? (cdr operands))
  64.          (null? (cddr operands)))
  65.     (if-expanded (make-combination expr block primitive operands))
  66.     (if-not-expanded))))
  67.  
  68. (define zero?-expansion
  69.   (unary-arithmetic (ucode-primitive zero?)))
  70.  
  71. (define positive?-expansion
  72.   (unary-arithmetic (ucode-primitive positive?)))
  73.  
  74. (define negative?-expansion
  75.   (unary-arithmetic (ucode-primitive negative?)))
  76.  
  77. (define 1+-expansion
  78.   (unary-arithmetic (ucode-primitive 1+)))
  79.  
  80. (define -1+-expansion
  81.   (unary-arithmetic (ucode-primitive -1+)))
  82.  
  83. (define quotient-expansion
  84.   (binary-arithmetic (ucode-primitive quotient 2)))
  85.  
  86. (define remainder-expansion
  87.   (binary-arithmetic (ucode-primitive remainder 2)))
  88.  
  89. (define modulo-expansion
  90.   (binary-arithmetic (ucode-primitive modulo 2)))
  91.  
  92. ;;;; N-ary Arithmetic Predicates
  93.  
  94. (define (pairwise-test binary-predicate if-left-zero if-right-zero)
  95.   (lambda (expr operands if-expanded if-not-expanded block)
  96.     (if (and (pair? operands)
  97.          (pair? (cdr operands))
  98.          (null? (cddr operands)))
  99.     (if-expanded
  100.      (cond ((constant-eq? (car operands) 0)
  101.         (make-combination expr block if-left-zero
  102.                   (list (cadr operands))))
  103.            ((constant-eq? (cadr operands) 0)
  104.         (make-combination expr block if-right-zero
  105.                   (list (car operands))))
  106.            (else
  107.         (make-combination expr block binary-predicate operands))))
  108.     (if-not-expanded))))
  109.  
  110. (define (pairwise-test-inverse inverse-expansion)
  111.   (lambda (expr operands if-expanded if-not-expanded block)
  112.     (inverse-expansion
  113.      expr operands
  114.       (lambda (expression)
  115.     (if-expanded
  116.      (make-combination expr block (ucode-primitive not)
  117.                (list expression))))
  118.       if-not-expanded
  119.       block)))
  120.  
  121. (define =-expansion
  122.   (pairwise-test (ucode-primitive &=)
  123.          (ucode-primitive zero?)
  124.          (ucode-primitive zero?)))
  125.  
  126. (define <-expansion
  127.   (pairwise-test (ucode-primitive &<)
  128.          (ucode-primitive positive?)
  129.          (ucode-primitive negative?)))
  130.  
  131. (define >-expansion
  132.   (pairwise-test (ucode-primitive &>)
  133.          (ucode-primitive negative?)
  134.          (ucode-primitive positive?)))
  135.  
  136. (define <=-expansion (pairwise-test-inverse >-expansion))
  137. (define >=-expansion (pairwise-test-inverse <-expansion))
  138.  
  139. ;;;; Fixnum Operations
  140.  
  141. (define (fix:zero?-expansion expr operands if-expanded if-not-expanded block)
  142.   (if (and (pair? operands) (null? (cdr operands)))
  143.       (if-expanded
  144.        (make-combination expr block (ucode-primitive eq?)
  145.              (list (car operands) (constant/make #f 0))))
  146.       (if-not-expanded)))
  147.  
  148. (define (fix:=-expansion expr operands if-expanded if-not-expanded block)
  149.   (if (and (pair? operands)
  150.        (pair? (cdr operands))
  151.        (null? (cddr operands)))
  152.       (if-expanded
  153.        (make-combination expr block (ucode-primitive eq?) operands))
  154.       (if-not-expanded)))
  155.  
  156. (define char=?-expansion
  157.   fix:=-expansion)
  158.  
  159. (define (fix:<=-expansion expr operands if-expanded if-not-expanded block)
  160.   (if (and (pair? operands)
  161.        (pair? (cdr operands))
  162.        (null? (cddr operands)))
  163.       (if-expanded
  164.        (make-combination
  165.     expr
  166.     block
  167.     (ucode-primitive not)
  168.     (list (make-combination #f
  169.                 block
  170.                 (ucode-primitive greater-than-fixnum?)
  171.                 operands))))
  172.       (if-not-expanded)))
  173.  
  174. (define (fix:>=-expansion expr operands if-expanded if-not-expanded block)
  175.   (if (and (pair? operands)
  176.        (pair? (cdr operands))
  177.        (null? (cddr operands)))
  178.       (if-expanded
  179.        (make-combination
  180.     expr
  181.     block
  182.     (ucode-primitive not)
  183.     (list (make-combination #f
  184.                 block
  185.                 (ucode-primitive less-than-fixnum?)
  186.                 operands))))
  187.       (if-not-expanded)))
  188.  
  189. ;;;; N-ary Arithmetic Field Operations
  190.  
  191. (define (right-accumulation identity make-binary)
  192.   (lambda (expr operands if-expanded if-not-expanded block)
  193.     (let ((operands (delq identity operands)))
  194.       (let ((n (length operands)))
  195.     (cond ((zero? n)
  196.            (if-expanded (constant/make
  197.                  (and expr (object/scode expr))
  198.                  identity)))
  199.           ((< n 5)
  200.            (if-expanded
  201.         (let loop
  202.             ((expr expr)
  203.              (first (car operands))
  204.              (rest (cdr operands)))
  205.           (if (null? rest)
  206.               first
  207.               (make-binary expr
  208.                    block
  209.                    first
  210.                    (loop #f (car rest) (cdr rest)))))))
  211.           (else
  212.            (if-not-expanded)))))))
  213.  
  214. (define +-expansion
  215.   (right-accumulation 0
  216.     (lambda (expr block x y)
  217.       (cond ((constant-eq? x 1)
  218.          (make-combination expr block (ucode-primitive 1+) (list y)))
  219.         ((constant-eq? y 1)
  220.          (make-combination expr block (ucode-primitive 1+) (list x)))
  221.         (else
  222.          (make-combination expr block (ucode-primitive &+) (list x y)))))))
  223.  
  224. (define *-expansion
  225.   (right-accumulation 1
  226.     (lambda (expr block x y)
  227.       (make-combination expr block (ucode-primitive &*) (list x y)))))
  228.  
  229. (define (expt-expansion expr operands if-expanded if-not-expanded block)
  230.   (let ((make-binder
  231.      (lambda (make-body)
  232.        (make-operand-binding expr
  233.                  block
  234.                  (car operands)
  235.                  make-body))))
  236.     (cond ((not (and (pair? operands)
  237.              (pair? (cdr operands))
  238.              (null? (cddr operands))))
  239.        (if-not-expanded))
  240.       ;;((constant-eq? (cadr operands) 0)
  241.       ;; (if-expanded (constant/make (and expr (object/scode expr)) 1)))
  242.       ((constant-eq? (cadr operands) 1)
  243.        (if-expanded (car operands)))
  244.       ((constant-eq? (cadr operands) 2)
  245.        (make-binder
  246.         (lambda (block operand)
  247.           (make-combination #f
  248.                 block
  249.                 (ucode-primitive &*)
  250.                 (list operand operand)))))
  251.       ((constant-eq? (cadr operands) 3)
  252.        (make-binder
  253.         (lambda (block operand)
  254.           (make-combination
  255.            #f
  256.            block
  257.            (ucode-primitive &*)
  258.            (list operand
  259.              (make-combination #f
  260.                        block
  261.                        (ucode-primitive &*)
  262.                        (list operand operand)))))))
  263.       ((constant-eq? (cadr operands) 4)
  264.        (make-binder
  265.         (lambda (block operand)
  266.           (make-combination
  267.            #f
  268.            block
  269.            (ucode-primitive &*)
  270.            (list (make-combination #f
  271.                        block
  272.                        (ucode-primitive &*)
  273.                        (list operand operand))
  274.              (make-combination #f
  275.                        block
  276.                        (ucode-primitive &*)
  277.                        (list operand operand)))))))
  278.       (else
  279.        (if-not-expanded)))))
  280.  
  281. (define (right-accumulation-inverse identity inverse-expansion make-binary)
  282.   (lambda (expr operands if-expanded if-not-expanded block)
  283.     (let ((expand
  284.        (lambda (expr x y)
  285.          (if-expanded
  286.           (if (constant-eq? y identity)
  287.           x
  288.           (make-binary expr block x y))))))
  289.       (cond ((null? operands)
  290.          (if-not-expanded))
  291.         ((null? (cdr operands))
  292.          (expand expr (constant/make #f identity) (car operands)))
  293.         (else
  294.          (inverse-expansion #f (cdr operands)
  295.            (lambda (expression)
  296.          (expand expr (car operands) expression))
  297.            if-not-expanded
  298.            block))))))
  299.  
  300. (define --expansion
  301.   (right-accumulation-inverse 0 +-expansion
  302.     (lambda (expr block x y)
  303.       (if (constant-eq? y 1)
  304.       (make-combination expr block (ucode-primitive -1+) (list x))
  305.       (make-combination expr block (ucode-primitive &-) (list x y))))))
  306.  
  307. (define /-expansion
  308.   (right-accumulation-inverse 1 *-expansion
  309.     (lambda (expr block x y)
  310.       (make-combination expr block (ucode-primitive &/) (list x y)))))
  311.  
  312. ;;;; N-ary List Operations
  313.  
  314. (define (apply*-expansion expr operands if-expanded if-not-expanded block)
  315.   (if (< 1 (length operands) 10)
  316.       (if-expanded
  317.        (combination/make
  318.     (and expr (object/scode expr))
  319.     block
  320.     (global-ref/make 'APPLY)
  321.     (list (car operands)
  322.           (cons*-expansion-loop #f block (cdr operands)))))
  323.       (if-not-expanded)))
  324.  
  325. (define (cons*-expansion expr operands if-expanded if-not-expanded block)
  326.   (if (< -1 (length operands) 9)
  327.       (if-expanded (cons*-expansion-loop expr block operands))
  328.       (if-not-expanded)))
  329.  
  330. (define (cons*-expansion-loop expr block rest)
  331.   (if (null? (cdr rest))
  332.       (car rest)
  333.       (make-combination expr
  334.             block
  335.             (ucode-primitive cons)
  336.             (list (car rest)
  337.                   (cons*-expansion-loop #f block (cdr rest))))))
  338.  
  339. (define (list-expansion expr operands if-expanded if-not-expanded block)
  340.   (if (< (length operands) 9)
  341.       (if-expanded (list-expansion-loop expr block operands))
  342.       (if-not-expanded)))
  343.  
  344. (define (list-expansion-loop expr block rest)
  345.   (if (null? rest)
  346.       (constant/make (and expr (object/scode expr)) '())
  347.       (make-combination expr block (ucode-primitive cons)
  348.             (list (car rest)
  349.                   (list-expansion-loop #f block (cdr rest))))))
  350.  
  351. (define (values-expansion expr operands if-expanded if-not-expanded block)
  352.   if-not-expanded
  353.   (if-expanded
  354.    (let ((block (block/make block #t '())))
  355.      (let ((variables
  356.         (map (lambda (operand)
  357.            operand
  358.            (variable/make&bind! block
  359.                     (string->uninterned-symbol "value")))
  360.          operands)))
  361.        (combination/make
  362.     (and expr (object/scode expr))
  363.     block
  364.     (procedure/make
  365.      #f
  366.      block lambda-tag:let variables '() #f
  367.      (let ((block (block/make block #t '())))
  368.        (let ((variable (variable/make&bind! block 'RECEIVER)))
  369.          (procedure/make
  370.           #f block lambda-tag:unnamed (list variable) '() #f
  371.           (combination/make #f
  372.                 block
  373.                 (reference/make #f block variable)
  374.                 (map (lambda (variable)
  375.                        (reference/make #f block variable))
  376.                      variables))))))
  377.     operands)))))
  378.  
  379. (define (call-with-values-expansion expr operands
  380.                     if-expanded if-not-expanded block)
  381.   (if (and (pair? operands)
  382.        (pair? (cdr operands))
  383.        (null? (cddr operands)))
  384.       (if-expanded
  385.        (combination/make (and expr (object/scode expr))
  386.              block
  387.              (combination/make #f block (car operands) '())
  388.              (cdr operands)))
  389.       (if-not-expanded)))
  390.  
  391. ;;;; General CAR/CDR Encodings
  392.  
  393. (define (general-car-cdr-expansion encoding)
  394.   (lambda (expr operands if-expanded if-not-expanded block)
  395.     (if (= (length operands) 1)
  396.     (if-expanded
  397.      (make-combination expr
  398.                block
  399.                (ucode-primitive general-car-cdr)
  400.                (list (car operands)
  401.                  (constant/make #f encoding))))
  402.     (if-not-expanded))))
  403.  
  404. (define caar-expansion (general-car-cdr-expansion #b111))
  405. (define cadr-expansion (general-car-cdr-expansion #b110))
  406. (define cdar-expansion (general-car-cdr-expansion #b101))
  407. (define cddr-expansion (general-car-cdr-expansion #b100))
  408.  
  409. (define caaar-expansion (general-car-cdr-expansion #b1111))
  410. (define caadr-expansion (general-car-cdr-expansion #b1110))
  411. (define cadar-expansion (general-car-cdr-expansion #b1101))
  412. (define caddr-expansion (general-car-cdr-expansion #b1100))
  413. (define cdaar-expansion (general-car-cdr-expansion #b1011))
  414. (define cdadr-expansion (general-car-cdr-expansion #b1010))
  415. (define cddar-expansion (general-car-cdr-expansion #b1001))
  416. (define cdddr-expansion (general-car-cdr-expansion #b1000))
  417.  
  418. (define caaaar-expansion (general-car-cdr-expansion #b11111))
  419. (define caaadr-expansion (general-car-cdr-expansion #b11110))
  420. (define caadar-expansion (general-car-cdr-expansion #b11101))
  421. (define caaddr-expansion (general-car-cdr-expansion #b11100))
  422. (define cadaar-expansion (general-car-cdr-expansion #b11011))
  423. (define cadadr-expansion (general-car-cdr-expansion #b11010))
  424. (define caddar-expansion (general-car-cdr-expansion #b11001))
  425. (define cadddr-expansion (general-car-cdr-expansion #b11000))
  426. (define cdaaar-expansion (general-car-cdr-expansion #b10111))
  427. (define cdaadr-expansion (general-car-cdr-expansion #b10110))
  428. (define cdadar-expansion (general-car-cdr-expansion #b10101))
  429. (define cdaddr-expansion (general-car-cdr-expansion #b10100))
  430. (define cddaar-expansion (general-car-cdr-expansion #b10011))
  431. (define cddadr-expansion (general-car-cdr-expansion #b10010))
  432. (define cdddar-expansion (general-car-cdr-expansion #b10001))
  433. (define cddddr-expansion (general-car-cdr-expansion #b10000))
  434.  
  435. (define first-expansion (general-car-cdr-expansion #b11))
  436. (define second-expansion  cadr-expansion)
  437. (define third-expansion   caddr-expansion)
  438. (define fourth-expansion  cadddr-expansion)
  439. (define fifth-expansion   (general-car-cdr-expansion #b110000))
  440. (define sixth-expansion   (general-car-cdr-expansion #b1100000))
  441. (define seventh-expansion (general-car-cdr-expansion #b11000000))
  442. (define eighth-expansion  (general-car-cdr-expansion #b110000000))
  443.  
  444. ;;;; Miscellaneous
  445.  
  446. (define (make-string-expansion expr operands if-expanded if-not-expanded block)
  447.   (if (and (pair? operands)
  448.        (null? (cdr operands)))
  449.       (if-expanded
  450.        (make-combination expr block (ucode-primitive string-allocate)
  451.              operands))
  452.       (if-not-expanded)))
  453.  
  454. (define (type-test-expansion type)
  455.   (lambda (expr operands if-expanded if-not-expanded block)
  456.     (if (and (pair? operands)
  457.          (null? (cdr operands)))
  458.     (if-expanded (make-type-test expr block type (car operands)))
  459.     (if-not-expanded))))
  460.  
  461. (define weak-pair?-expansion (type-test-expansion (ucode-type weak-cons)))
  462.  
  463. (define (exact-integer?-expansion expr operands if-expanded if-not-expanded
  464.                   block)
  465.   (if (and (pair? operands)
  466.        (null? (cdr operands)))
  467.       (if-expanded
  468.        (make-operand-binding expr block (car operands)
  469.      (lambda (block operand)
  470.        (make-disjunction
  471.         expr
  472.         (make-type-test #f block (ucode-type fixnum) operand)
  473.         (make-type-test #f block (ucode-type big-fixnum) operand)))))
  474.       (if-not-expanded)))
  475.  
  476. (define (exact-rational?-expansion expr operands if-expanded if-not-expanded
  477.                    block)
  478.   (if (and (pair? operands)
  479.        (null? (cdr operands)))
  480.       (if-expanded
  481.        (make-operand-binding expr block (car operands)
  482.      (lambda (block operand)
  483.        (make-disjunction
  484.         expr
  485.         (make-type-test #f block (ucode-type fixnum) operand)
  486.         (make-type-test #f block (ucode-type big-fixnum) operand)
  487.         (make-type-test #f block (ucode-type ratnum) operand)))))
  488.       (if-not-expanded)))
  489.  
  490. (define (complex?-expansion expr operands if-expanded if-not-expanded block)
  491.   (if (and (pair? operands)
  492.        (null? (cdr operands)))
  493.       (if-expanded
  494.        (make-operand-binding expr block (car operands)
  495.      (lambda (block operand)
  496.        (make-disjunction
  497.         expr
  498.         (make-type-test #f block (ucode-type fixnum) operand)
  499.         (make-type-test #f block (ucode-type big-fixnum) operand)
  500.         (make-type-test #f block (ucode-type ratnum) operand)
  501.         (make-type-test #f block (ucode-type big-flonum) operand)
  502.         (make-type-test #f block (ucode-type recnum) operand)))))
  503.       (if-not-expanded)))
  504.  
  505. (define (symbol?-expansion expr operands if-expanded if-not-expanded block)
  506.   (if (and (pair? operands)
  507.        (null? (cdr operands)))
  508.       (if-expanded
  509.        (make-operand-binding expr block (car operands)
  510.      (lambda (block operand)
  511.        (make-disjunction
  512.         expr
  513.         (make-type-test #f block (ucode-type interned-symbol) operand)
  514.         (make-type-test #f block (ucode-type uninterned-symbol)
  515.                 operand)))))
  516.       (if-not-expanded)))
  517.  
  518. (define (make-disjunction expr . clauses)
  519.   (let loop ((clauses clauses))
  520.     (if (null? (cdr clauses))
  521.     (car clauses)
  522.     (disjunction/make (and expr (object/scode expr))
  523.               (car clauses) (loop (cdr clauses))))))
  524.  
  525. (define (make-type-test expr block type operand)
  526.   (make-combination expr block
  527.             (ucode-primitive object-type?)
  528.             (list (constant/make #f type) operand)))
  529.  
  530. (define (string->symbol-expansion expr operands if-expanded if-not-expanded
  531.                   block)
  532.   block
  533.   (if (and (pair? operands)
  534.        (constant? (car operands))
  535.        (string? (constant/value (car operands)))
  536.        (null? (cdr operands)))
  537.       (if-expanded
  538.        (constant/make (and expr (object/scode expr))
  539.               (string->symbol (constant/value (car operands)))))
  540.       (if-not-expanded)))
  541.  
  542. (define (intern-expansion expr operands if-expanded if-not-expanded block)
  543.   block
  544.   (if (and (pair? operands)
  545.        (constant? (car operands))
  546.        (string? (constant/value (car operands)))
  547.        (null? (cdr operands)))
  548.       (if-expanded
  549.        (constant/make (and expr (object/scode expr))
  550.               (intern (constant/value (car operands)))))
  551.       (if-not-expanded)))
  552.  
  553. (define (int:->flonum-expansion expr operands if-expanded if-not-expanded
  554.                 block)
  555.   (if (and (pair? operands)
  556.        (null? (cdr operands)))
  557.       (if-expanded
  558.        (make-combination expr
  559.              block
  560.              (ucode-primitive integer->flonum 2)
  561.              (list (car operands) (constant/make #f #b10))))
  562.       (if-not-expanded)))
  563.  
  564. (define (flo:<=-expansion expr operands if-expanded if-not-expanded block)
  565.   (if (and (pair? operands)
  566.        (pair? (cdr operands))
  567.        (null? (cddr operands)))
  568.       (if-expanded
  569.        (make-combination
  570.     expr
  571.     block
  572.     (ucode-primitive not)
  573.     (list (make-combination #f
  574.                 block
  575.                 (ucode-primitive flonum-greater?)
  576.                 operands))))
  577.       (if-not-expanded)))
  578.  
  579. (define (flo:>=-expansion expr operands if-expanded if-not-expanded block)
  580.   (if (and (pair? operands)
  581.        (pair? (cdr operands))
  582.        (null? (cddr operands)))
  583.       (if-expanded
  584.        (make-combination
  585.     expr
  586.     block
  587.     (ucode-primitive not)
  588.     (list (make-combination #f
  589.                 block
  590.                 (ucode-primitive flonum-less?)
  591.                 operands))))
  592.       (if-not-expanded)))
  593.  
  594. ;;;; Tables
  595.  
  596. (define usual-integrations/expansion-names
  597.   '(
  598.     *
  599.     +
  600.     -
  601.     -1+
  602.     /
  603.     1+
  604.     <
  605.     <=
  606.     =
  607.     >
  608.     >=
  609.     apply
  610.     caaaar
  611.     caaadr
  612.     caaar
  613.     caadar
  614.     caaddr
  615.     caadr
  616.     caar
  617.     cadaar
  618.     cadadr
  619.     cadar
  620.     caddar
  621.     cadddr
  622.     caddr
  623.     cadr
  624.     call-with-values
  625.     cdaaar
  626.     cdaadr
  627.     cdaar
  628.     cdadar
  629.     cdaddr
  630.     cdadr
  631.     cdar
  632.     cddaar
  633.     cddadr
  634.     cddar
  635.     cdddar
  636.     cddddr
  637.     cdddr
  638.     cddr
  639.     char=?
  640.     complex?
  641.     cons*
  642.     eighth
  643.     exact-integer?
  644.     exact-rational?
  645.     expt
  646.     fifth
  647.     first
  648.     fix:<=
  649.     fix:=
  650.     fix:>=
  651.     flo:<=
  652.     flo:>=
  653.     fourth
  654.     int:->flonum
  655.     int:integer?
  656.     intern
  657.     list
  658.     make-string
  659.     ;; modulo    ; Compiler does not currently open-code it.
  660.     negative?
  661.     number?
  662.     positive?
  663.     quotient
  664.     remainder
  665.     second
  666.     seventh
  667.     sixth
  668.     string->symbol
  669.     symbol?
  670.     third
  671.     values
  672.     weak-pair?
  673.     with-values
  674.     zero?
  675.     ))
  676.  
  677. (define usual-integrations/expansion-values
  678.   (list
  679.    *-expansion
  680.    +-expansion
  681.    --expansion
  682.    -1+-expansion
  683.    /-expansion
  684.    1+-expansion
  685.    <-expansion
  686.    <=-expansion
  687.    =-expansion
  688.    >-expansion
  689.    >=-expansion
  690.    apply*-expansion
  691.    caaaar-expansion
  692.    caaadr-expansion
  693.    caaar-expansion
  694.    caadar-expansion
  695.    caaddr-expansion
  696.    caadr-expansion
  697.    caar-expansion
  698.    cadaar-expansion
  699.    cadadr-expansion
  700.    cadar-expansion
  701.    caddar-expansion
  702.    cadddr-expansion
  703.    caddr-expansion
  704.    cadr-expansion
  705.    call-with-values-expansion
  706.    cdaaar-expansion
  707.    cdaadr-expansion
  708.    cdaar-expansion
  709.    cdadar-expansion
  710.    cdaddr-expansion
  711.    cdadr-expansion
  712.    cdar-expansion
  713.    cddaar-expansion
  714.    cddadr-expansion
  715.    cddar-expansion
  716.    cdddar-expansion
  717.    cddddr-expansion
  718.    cdddr-expansion
  719.    cddr-expansion
  720.    char=?-expansion
  721.    complex?-expansion
  722.    cons*-expansion
  723.    eighth-expansion
  724.    exact-integer?-expansion
  725.    exact-rational?-expansion
  726.    expt-expansion
  727.    fifth-expansion
  728.    first-expansion
  729.    fix:<=-expansion
  730.    fix:=-expansion
  731.    fix:>=-expansion
  732.    flo:<=-expansion
  733.    flo:>=-expansion
  734.    fourth-expansion
  735.    int:->flonum-expansion
  736.    exact-integer?-expansion
  737.    intern-expansion
  738.    list-expansion
  739.    make-string-expansion
  740.    ;; modulo-expansion
  741.    negative?-expansion
  742.    complex?-expansion
  743.    positive?-expansion
  744.    quotient-expansion
  745.    remainder-expansion
  746.    second-expansion
  747.    seventh-expansion
  748.    sixth-expansion
  749.    string->symbol-expansion
  750.    symbol?-expansion
  751.    third-expansion
  752.    values-expansion
  753.    weak-pair?-expansion
  754.    call-with-values-expansion
  755.    zero?-expansion
  756.    ))
  757.  
  758. (define usual-integrations/expansion-alist
  759.   (map cons
  760.        usual-integrations/expansion-names
  761.        usual-integrations/expansion-values))
  762.  
  763. ;;;;  Hooks and utilities for user defined reductions and expanders
  764.  
  765. ;;; User defined reductions appear in reduct.scm
  766.  
  767. ;;; Scode->Scode expanders
  768.  
  769. (define (scode->scode-expander scode-expander)
  770.   (lambda (expr operands if-expanded if-not-expanded block)
  771.     (scode-expander
  772.      (map cgen/external-with-declarations operands)
  773.      (lambda (scode-expression)
  774.        (if-expanded
  775.     (reassign
  776.      expr
  777.      (transform/recursive
  778.       block
  779.       (integrate/get-top-level-block)
  780.       scode-expression))))
  781.      if-not-expanded)))
  782.  
  783. ;;; Kludge for EXPAND-OPERATOR declaration.
  784. (define expander-evaluation-environment
  785.   (the-environment))