mescc: Refactor variable declaration.

* module/language/c99/compiler.mes (decl->info): Refactor.
This commit is contained in:
Jan Nieuwenhuizen 2018-05-05 12:30:06 +02:00
parent 1b8d59fd0f
commit c9ba7a619b
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
26 changed files with 2561 additions and 1780 deletions

View File

@ -75,6 +75,7 @@ t
46-function-static 46-function-static
47-function-expression 47-function-expression
48-function-destruct 48-function-destruct
49-global-static
50-assert 50-assert
51-strcmp 51-strcmp
52-itoa 52-itoa
@ -82,6 +83,7 @@ t
54-argv 54-argv
60-math 60-math
61-array 61-array
62-array
63-struct-cell 63-struct-cell
64-make-cell 64-make-cell
65-read 65-read
@ -205,8 +207,8 @@ tests="
50_logical_second_arg 50_logical_second_arg
51_static 51_static
52_unnamed_enum 52_unnamed_enum
55_lshift_type
54_goto 54_goto
55_lshift_type
" "
broken="$broken broken="$broken
@ -219,6 +221,7 @@ broken="$broken
27_sizeof 27_sizeof
28_strings 28_strings
31_args
32_led 32_led
34_array_assignment 34_array_assignment
37_sprintf 37_sprintf
@ -230,7 +233,6 @@ broken="$broken
46_grep 46_grep
49_bracket_evaluation 49_bracket_evaluation
51_static
52_unnamed_enum 52_unnamed_enum
55_lshift_type 55_lshift_type
" "

87
doc/UPDATE-0.13 Normal file
View File

@ -0,0 +1,87 @@
Subject: wip-bootstrap updated
I've updated the wip-bootstrap branch[0] for Mes[1] 0.13. It has new
mes-boot and tcc-boot packages. mes-boot is a bootstrap version of
Mes; it only depends on mescc-tools and a previously compiled mes.M1
seed. Likewise, tcc-boot depends on a precompiled tcc-seed. Also,
tcc-boot uses a heavily patched version of the tcc sources.
Mes 0.13 is the first release that can bootstrap a fairly functional
tcc-boot. This bootstrapped tcc passes 67/68 C tests that were created
for MesCC. It can compile a version if itself where float, long long
and bitfield are patched out...but linking fails. This amazing
compiler can now be played with by doing something like
--8<---------------cut here---------------start------------->8---
git checkout wip-bootstrap
make
./pre-inst-env guix build tcc-boot # may take ~2h
./pre-inst-env guix environment --ad-hoc tcc-boot
mes-tcc --help #duck and run
--8<---------------cut here---------------end--------------->8---
The next big effort will be to make this mes-tcc fully functional and
integrate this with GuixSD. To give you a taste of that,
here's latest bug I'm currently looking at (pretty printed comments
are only added when Guile runs MesCC, the problem is in LEA)
--8<---------------cut here---------------start------------->8---
$ diff -u ../mes-seed/mes.M1 src/mes.M1
--- ../mes-seed/mes.M1 2018-05-01 18:49:37.312162270 +0200
+++ src/mes.M1 2018-05-01 19:49:40.774770406 +0200
@@ -35805,12 +33091,11 @@
call32 %strcpy
add____$i8,%esp !0x8
test___%eax,%eax
- # strcpy(buf + strlen(buf), "/mes/");
- push___$i32 &_string_reader_read_list_266
+ push___$i32 &_string_reader_read_list_265
mov____%ebp,%eax
- add____$i32,%eax %0x-200
+ add____$i32,%eax %0x-800
push___%eax
- lea____0x32(%ebp),%eax %0x-200
+ lea____0x32(%ebp),%eax %0x-800
push___%eax
call32 %strlen
add____$i8,%esp !0x4
--8<---------------cut here---------------end--------------->8---
We also need to remove some shortcuts that we took, most notably:
mes-seed[3]. This seed consists of 1MB of M1 code. mes.M1 is
produced by compiling mes.c using MesCC, the C compiler written in
(Guile) Scheme that comes with Mes. Although that's really terrible,
it's probably a big step forward: currently GuixSD uses ~250MB of
binary seed: the bootstrap binaries.
The plan is to replace the mes.M1 seed with mes.M2 and compile this
new mes.M2 seed using the brand new M2-Planet[2]. M2 is basically
simple C with structs, without preprocessor. This will reduce the
seed size by a factor of 10 while making it much more readable.
An excerpt of the TODO I keep in Mes' BOOTSTRAP document
--8<---------------cut here---------------start------------->8---
* TODO
** have tcc-boot's mes-tcc compile a fully functional tcc
*** mescc: fix unknown bug.
*** mescc: support function-static.
*** mescc: support/grok global static.
*** mescc: support unsigned comparison, arithmetic.
*** mescc: support long long (do we need long long to get long long in tcc)?
*** mescc: support bitfield (do we need bitfield to get bitfield in tcc)?
*** mescc: support float (do we need float to get float in tcc)?
** have bootstrapped tcc compile gcc-4.7
** remove or upstream patches from tcc-boot
** prepare src/mes.c for M2-Planet[2] transpiler
** integrate with GuixSD
** x86_64, arm, the Hurd
--8<---------------cut here---------------end--------------->8---
Greetings,
janneke
[0] http://git.savannah.gnu.org/cgit/guix.git/log/?h=wip-bootstrap
[1] https://gitlab.com/janneke/mes
[2] https://github.com/oriansj/m2-planet
[3] https://gitlab.com/janneke/mes-seed

File diff suppressed because it is too large Load Diff

View File

@ -57,6 +57,7 @@
global:name global:name
global:type global:type
global:pointer global:pointer
global:array
global:value global:value
global:function global:function
global->string global->string
@ -66,6 +67,7 @@
local? local?
local:type local:type
local:pointer local:pointer
local:array
local:id local:id
<function> <function>
@ -109,11 +111,12 @@
(description type:description)) (description type:description))
(define-immutable-record-type <global> (define-immutable-record-type <global>
(make-global name type pointer value function) (make-global name type pointer array value function)
global? global?
(name global:name) (name global:name)
(type global:type) (type global:type)
(pointer global:pointer) (pointer global:pointer)
(array global:array)
(value global:value) (value global:value)
(function global:function)) (function global:function))
@ -122,10 +125,11 @@
(global:name o))) (global:name o)))
(define-immutable-record-type <local> (define-immutable-record-type <local>
(make-local type pointer id) (make-local type pointer array id)
local? local?
(type local:type) (type local:type)
(pointer local:pointer) (pointer local:pointer)
(array local:array)
(id local:id)) (id local:id))
(define-immutable-record-type <function> (define-immutable-record-type <function>

View File

@ -129,9 +129,11 @@
(hex2:address address)) (hex2:address address))
((#:address (#:address ,global)) (guard (global? global)) ((#:address (#:address ,global)) (guard (global? global))
(hex2:address (global->string global))) (hex2:address (global->string global)))
((#:string ,string) (hex2:address (string->label o))) ((#:string ,string)
((#:address ,address) (string? address) (hex2:address address)) (hex2:address (string->label o)))
((#:address ,global) (global? global) (error "urg1: global without a name\n")) ((#:address ,address) (guard (string? address)) (hex2:address address))
((#:address ,global) (guard (global? global))
(hex2:address (global->string global)))
((#:offset ,offset) (hex2:offset offset)) ((#:offset ,offset) (hex2:offset offset))
((#:offset1 ,offset1) (hex2:offset1 offset1)) ((#:offset1 ,offset1) (hex2:offset1 offset1))
((#:immediate ,immediate) (hex2:immediate immediate)) ((#:immediate ,immediate) (hex2:immediate immediate))

View File

@ -0,0 +1,25 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
'boo
'4a
12345
-22
+44
(list 0)
'...

View File

@ -0,0 +1,56 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
"Mes is distributed WITHOUT ANY WARRANTY. The following
sections from the GNU General Public License, version 3, should
make that clear.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
See <http://www.gnu.org/licenses/gpl.html>, for more details.
"

View File

@ -0,0 +1,28 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
(list 00 01 02 03 04 05 06 07 08 09
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 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99)

View File

@ -0,0 +1,19 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
(list 0 1 (list 20 21) 3)

View File

@ -0,0 +1,564 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
;; boot-00.scm
(define mes %version)
(define (defined? x)
(assq x (current-module)))
(define (cond-expand-expander clauses)
(if (defined? (car (car clauses)))
(cdr (car clauses))
(cond-expand-expander (cdr clauses))))
(define-macro (cond-expand . clauses)
(cons 'begin (cond-expand-expander clauses)))
;; end boot-00.scm
;; boot-01.scm
(define <cell:character> 0)
(define <cell:pair> 7)
(define <cell:string> 10)
(define (pair? x) (eq? (core:type x) <cell:pair>))
(define (not x) (if x #f #t))
(define (display x . rest)
(if (null? rest) (core:display x)
(core:display-port x (car rest))))
(define (write x . rest)
(if (null? rest) (core:write x)
(core:write-port x (car rest))))
(define (list->string lst)
(core:make-cell <cell:string> lst 0))
(define (integer->char x)
(core:make-cell <cell:character> 0 x))
(define (newline . rest)
(core:display (list->string (list (integer->char 10)))))
(define (string->list s)
(core:car s))
(define (cadr x) (car (cdr x)))
(define (map1 f lst)
(if (null? lst) (list)
(cons (f (car lst)) (map1 f (cdr lst)))))
(define map map1)
(define (cons* . rest)
(if (null? (cdr rest)) (car rest)
(cons (car rest) (core:apply cons* (cdr rest) (current-module)))))
(define (apply f h . t)
(if (null? t) (core:apply f h (current-module))
(apply f (apply cons* (cons h t)))))
(define (append . rest)
(if (null? rest) '()
(if (null? (cdr rest)) (car rest)
(append2 (car rest) (apply append (cdr rest))))))
;; end boot-01.scm
;;((lambda (*program*) *program*) (primitive-load 0))
;;(primitive-load 0)
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
(define-macro (and . x)
(if (null? x) #t
(if (null? (cdr x)) (car x)
(list (quote if) (car x) (cons (quote and) (cdr x))
#f))))
(define-macro (or . x)
(if (null? x) #f
(if (null? (cdr x)) (car x)
(list (list (quote lambda) (list (quote r))
(list (quote if) (quote r) (quote r)
(cons (quote or) (cdr x))))
(car x)))))
(define else #t)
(define-macro (cond . clauses)
(list 'if (pair? clauses)
(list (cons
'lambda
(cons
'(test)
(list (list 'if 'test
(if (pair? (cdr (car clauses)))
(if (eq? (car (cdr (car clauses))) '=>)
(append2 (cdr (cdr (car clauses))) '(test))
(list (cons 'lambda (cons '() (cons 'test (cdr (car clauses)))))))
(list (cons 'lambda (cons '() (cons 'test (cdr (car clauses)))))))
(if (pair? (cdr clauses))
(cons 'cond (cdr clauses)))))))
(car (car clauses)))))
(define (memq x lst)
(if (null? lst) #f
(if (eq? x (car lst)) lst
(memq x (cdr lst)))))
;; (cond-expand
;; (guile
;; (define closure identity)
;; (define body identity)
;; (define append2 append)
;; (define (core:apply f a m) (f a))
;; )
;; (mes
(define <cell:symbol> 11)
(define (symbol? x)
(eq? (core:type x) <cell:symbol>))
(define (string->symbol s)
(if (not (pair? (core:car s))) '()
(core:lookup-symbol (core:car s))))
(define <cell:string> 10)
(define (string? x)
(eq? (core:type x) <cell:string>))
(define <cell:vector> 14)
(define (vector? x)
(eq? (core:type x) <cell:vector>))
;; (define (body x)
;; (core:cdr (core:cdr (core:cdr (cdr (assq 'x (current-module)))))))
;; (define (closure x)
;; (map car (cdr (core:cdr (core:car (core:cdr (cdr (assq 'x (current-module)))))))))
;; ))
(define (cons* . rest)
(if (null? (cdr rest)) (car rest)
(cons (car rest) (core:apply cons* (cdr rest) (current-module)))))
(define (apply f h . t)
(if (null? t) (core:apply f h (current-module))
(apply f (apply cons* (cons h t)))))
(define (append . rest)
(if (null? rest) '()
(if (null? (cdr rest)) (car rest)
(append2 (car rest) (apply append (cdr rest))))))
(define-macro (quasiquote x)
;;(core:display-error "quasiquote:") (core:write-error x) (core:display-error "\n")
(define (loop x)
;;(core:display-error "loop:") (core:write-error x) (core:display-error "\n")
(if (vector? x) (list 'list->vector (loop (vector->list x)))
(if (not (pair? x)) (cons 'quote (cons x '()))
(if (eq? (car x) 'quasiquote) (loop (loop (cadr x)))
(if (eq? (car x) 'unquote) (cadr x)
(if (and (pair? (car x)) (eq? (caar x) 'unquote-splicing))
((lambda (d)
(list 'append (car (cdr (car x))) d))
(loop (cdr x)))
((lambda (a d)
(if (pair? d)
(if (eq? (car d) 'quote)
(if (and (pair? a) (eq? (car a) 'quote))
(list 'quote (cons (cadr a) (cadr d)))
(if (null? (cadr d))
(list 'list a)
(list 'cons* a d)))
(if (memq (car d) '(list cons*))
(cons (car d) (cons a (cdr d)))
(list 'cons* a d)))
(list 'cons* a d)))
(loop (car x))
(loop (cdr x)))))))))
(loop x))
(define (caar x) (car (car x)))
(define (cadr x) (car (cdr x)))
(define (cdar x) (cdr (car x)))
(define (cddr x) (cdr (cdr x)))
(define-macro (simple-let bindings . rest)
(cons (cons 'lambda (cons (map car bindings) rest))
(map cadr bindings)))
(define-macro (xsimple-let bindings rest)
`(,`(lambda ,(map car bindings) ,@rest)
,@(map cadr bindings)))
(define-macro (xnamed-let name bindings rest)
`(simple-let ((,name *unspecified*))
(set! ,name (lambda ,(map car bindings) ,@rest))
(,name ,@(map cadr bindings))))
(define-macro (let bindings-or-name . rest)
(if (symbol? bindings-or-name) ;; IF
`(xnamed-let ,bindings-or-name ,(car rest) ,(cdr rest))
`(xsimple-let ,bindings-or-name ,rest)))
(define (expand-let* bindings body)
(if (null? bindings)
`((lambda () ,@body))
`((lambda (,(caar bindings))
,(expand-let* (cdr bindings) body))
,@(cdar bindings))))
(define-macro (let* bindings . body)
(expand-let* bindings body))
(define (equal2? a b)
(if (and (null? a) (null? b)) #t
(if (and (pair? a) (pair? b))
(and (equal2? (car a) (car b))
(equal2? (cdr a) (cdr b)))
(if (and (string? a) (string? b))
(eq? (string->symbol a) (string->symbol b))
(if (and (vector? a) (vector? b))
(equal2? (vector->list a) (vector->list b))
(eq? a b))))))
(define equal? equal2?)
(define (member x lst)
(if (null? lst) #f
(if (equal2? x (car lst)) lst
(member x (cdr lst)))))
(define (<= . rest)
(or (apply < rest)
(apply = rest)))
(define (>= . rest)
(or (apply > rest)
(apply = rest)))
(define (list? x)
(or (null? x)
(and (pair? x) (list? (cdr x)))))
;; -*-scheme-*-
;;; Mes --- Maxwell Equations of Software
;;; Copyright (c) 1993-2004 by Richard Kelsey and Jonathan Rees.
;;; Copyright © 2016 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;; syntax.mes is loaded after scm.mes. It provides the R5RS hygienic
;;; macros define-syntax, syntax-rules and define-syntax-rule.
;;; syntax-rules is adapted from scheme48-1.1/scheme/alt/syntax.scm
;;; Code:
;;; Copyright (c) 1993-2004 by Richard Kelsey and Jonathan Rees. See file COPYING.
;;; scheme48-1.1/COPYING
;; Copyright (c) 1993-2004 Richard Kelsey and Jonathan Rees
;; All rights reserved.
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following conditions
;; are met:
;; 1. Redistributions of source code must retain the above copyright
;; notice, this list of conditions and the following disclaimer.
;; 2. Redistributions in binary form must reproduce the above copyright
;; notice, this list of conditions and the following disclaimer in the
;; documentation and/or other materials provided with the distribution.
;; 3. The name of the authors may not be used to endorse or promote products
;; derived from this software without specific prior written permission.
;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
;; IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
(cond-expand
(guile)
(mes
(define-macro (define-syntax macro-name transformer . stuff)
`(define-macro (,macro-name . args)
(,transformer (cons ',macro-name args)
(lambda (x0) x0)
eq?)))))
;; Rewrite-rule compiler (a.k.a. "extend-syntax")
;; Example:
;;
;; (define-syntax or
;; (syntax-rules ()
;; ((or) #f)
;; ((or e) e)
;; ((or e1 e ...) (let ((temp e1))
;; (if temp temp (or e ...))))))
(cond-expand
(guile)
(mes
(define-syntax syntax-rules
(let ()
(define name? symbol?)
(define (segment-pattern? pattern)
(and (segment-template? pattern)
(or (null? (cddr pattern))
(syntax-error0 "segment matching not implemented" pattern))))
(define (segment-template? pattern)
(and (pair? pattern)
(pair? (cdr pattern))
(memq (cadr pattern) indicators-for-zero-or-more)))
(define indicators-for-zero-or-more (list (string->symbol "...") '---))
(lambda (exp r c)
(define %input (r '%input)) ;Gensym these, if you like.
(define %compare (r '%compare))
(define %rename (r '%rename))
(define %tail (r '%tail))
(define %temp (r '%temp))
(define rules (cddr exp))
(define subkeywords (cadr exp))
(define (make-transformer rules)
;;(core:display-error "make-transformer:") (core:write-error rules) (core:display-error "\n")
`(lambda (,%input ,%rename ,%compare)
(let ((,%tail (cdr ,%input)))
(cond ,@(map process-rule rules)
(else
(syntax-error1
"use of macro doesn't match definition"
,%input))))))
(define (process-rule rule)
;;(core:display-error "process-rule:") (core:write-error rule) (core:display-error "\n")
(if (and (pair? rule)
(pair? (cdr rule))
(null? (cddr rule)))
(let ((pattern (cdar rule))
(template (cadr rule)))
`((and ,@(process-match %tail pattern))
(let* ,(process-pattern pattern
%tail
(lambda (x) x))
,(process-template template
0
(meta-variables pattern 0 '())))))
(syntax-error2 "ill-formed syntax rule" rule)))
;; Generate code to test whether input expression matches pattern
(define (process-match input pattern)
;;(core:display-error "process-match:") (core:write-error input) (core:display-error "\n")
;;(core:display-error " pattern:") (core:write-error pattern) (core:display-error "\n")
(cond ((name? pattern)
(if (member pattern subkeywords)
`((,%compare ,input (,%rename ',pattern)))
`()))
((segment-pattern? pattern)
(process-segment-match input (car pattern)))
((pair? pattern)
`((let ((,%temp ,input))
(and (pair? ,%temp)
,@(process-match `(car ,%temp) (car pattern))
,@(process-match `(cdr ,%temp) (cdr pattern))))))
((or (null? pattern) (boolean? pattern) (char? pattern))
`((eq? ,input ',pattern)))
(else
`((equal? ,input ',pattern)))))
(define (process-segment-match input pattern)
;;(core:display-error "process-segment-match:") (core:write-error input) (core:display-error "\n")
;;(core:display-error " pattern:") (core:write-error pattern) (core:display-error "\n")
(let ((conjuncts (process-match '(car l) pattern)))
(if (null? conjuncts)
`((list? ,input)) ;+++
`((let loop ((l ,input))
(or (null? l)
(and (pair? l)
,@conjuncts
(loop (cdr l)))))))))
;; Generate code to take apart the input expression
;; This is pretty bad, but it seems to work (can't say why).
(define (process-pattern pattern path mapit)
;;(core:display-error "process-pattern:") (core:write-error pattern) (core:display-error "\n")
;;(core:display-error " path:") (core:write-error path) (core:display-error "\n")
(cond ((name? pattern)
(if (memq pattern subkeywords)
'()
(list (list pattern (mapit path)))))
((segment-pattern? pattern)
(process-pattern (car pattern)
%temp
(lambda (x) ;temp is free in x
(mapit (if (eq? %temp x)
path ;+++
`(map (lambda (,%temp) ,x)
,path))))))
((pair? pattern)
(append (process-pattern (car pattern) `(car ,path) mapit)
(process-pattern (cdr pattern) `(cdr ,path) mapit)))
(else '())))
;; Generate code to compose the output expression according to template
(define (process-template template rank env)
;;(core:display-error "process-template:") (core:write-error template) (core:display-error "\n")
(cond ((name? template)
(let ((probe (assq template env)))
(if probe
(if (<= (cdr probe) rank)
template
(syntax-error3 "template rank error (too few ...'s?)"
template))
`(,%rename ',template))))
((segment-template? template)
(let ((vars
(free-meta-variables (car template) (+ rank 1) env '())))
(if (null? vars)
(silent-syntax-error4 "too many ...'s" template)
(let* ((x (process-template (car template)
(+ rank 1)
env))
(gen (if (equal? (list x) vars)
x ;+++
`(map (lambda ,vars ,x)
,@vars))))
(if (null? (cddr template))
gen ;+++
`(append ,gen ,(process-template (cddr template)
rank env)))))))
((pair? template)
`(cons ,(process-template (car template) rank env)
,(process-template (cdr template) rank env)))
(else `(quote ,template))))
;; Return an association list of (var . rank)
(define (meta-variables pattern rank vars)
;;(core:display-error "meta-variables:") (core:write-error pattern) (core:display-error "\n")
(cond ((name? pattern)
(if (memq pattern subkeywords)
vars
(cons (cons pattern rank) vars)))
((segment-pattern? pattern)
(meta-variables (car pattern) (+ rank 1) vars))
((pair? pattern)
(meta-variables (car pattern) rank
(meta-variables (cdr pattern) rank vars)))
(else vars)))
;; Return a list of meta-variables of given higher rank
(define (free-meta-variables template rank env free)
;;(core:display-error "meta-variables:") (core:write-error template) (core:display-error "\n")
(cond ((name? template)
(if (and (not (memq template free))
(let ((probe (assq template env)))
(and probe (>= (cdr probe) rank))))
(cons template free)
free))
((segment-template? template)
(free-meta-variables (car template)
rank env
(free-meta-variables (cddr template)
rank env free)))
((pair? template)
(free-meta-variables (car template)
rank env
(free-meta-variables (cdr template)
rank env free)))
(else free)))
c ;ignored
;; Kludge for Scheme48 linker.
;; `(cons ,(make-transformer rules)
;; ',(find-free-names-in-syntax-rules subkeywords rules))
(make-transformer rules))))))
(cond-expand
(guile)
(mes
(define-macro (let-syntax bindings . rest)
`((lambda ()
,@(map (lambda (binding)
`(define-macro (,(car binding) . args)
(,(cadr binding) (cons ',(car binding) args)
(lambda (x0) x0)
eq?)))
bindings)
,@rest)))))
(core:display
(let-syntax ((xwhen (syntax-rules ()
((xwhen condition exp ...)
(if (not condition)
(begin exp ...))))))
(xwhen #f 42)))

60
scaffold/boot/call-cc.scm Normal file
View File

@ -0,0 +1,60 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
;; ,expand (let loop ((i 10)) (if (eq? i 0) 0 (begin (core:display-error i) (core:display-error "\n") (loop (- i 1)))))
;; (let loop ((i 10)) (if (eq? i 0) 0 (begin (display i) (display "\n") (loop (- i 1)))))
(define global "global\n")
(define v #(0 1 2))
(define vv #(#(0 1 2) 0 1 2))
((lambda (loop)
(set! loop
(lambda (i)
(core:display global)
(core:display (values 'foobar global))
(core:display v)
(core:display vv)
(core:display "i=")
(core:display i)
(core:display "\n")
(if (eq? i 0) 0
(begin
((lambda (cont seen?)
(+ 1 (call-with-current-continuation (lambda (c) (set! cont c) 1)))
(core:display " seen?=")
(core:display seen?)
(core:display "\n")
(if seen? 0
(begin
(set! seen? #t)
(cont 2))))
#f #f)
(loop (- i 1))))))
(loop 10000))
*unspecified*)
;; ((lambda (cont seen?)
;; (+ 1 (call-with-current-continuation (lambda (c) (set! cont c) 1)))
;; (core:display "seen?=")
;; (core:display seen?)
;; (core:display "\n")
;; (if seen? 0
;; (begin
;; (set! seen? #t)
;; (cont 2))))
;; #f #f)

41
scaffold/boot/memory.scm Normal file
View File

@ -0,0 +1,41 @@
;;; Mes --- Maxwell Equations of Software
;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of Mes.
;;;
;;; Mes 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 3 of the License, or (at
;;; your option) any later version.
;;;
;;; Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
;; ,expand (let loop ((i 10)) (if (eq? i 0) 0 (begin (core:display-error i) (core:display-error "\n") (loop (- i 1)))))
;; (let loop ((i 10)) (if (eq? i 0) 0 (begin (display i) (display "\n") (loop (- i 1)))))
((lambda (loop)
(set! loop
(lambda (i)
(if (eq? i 0) 0
(begin
(core:display i)
(core:display "\n")
(loop (- i 1))))))
(loop 10))
*unspecified*)
;; ((lambda (loop)
;; (set! loop
;; (lambda (i)
;; (if (eq? i 0) 0
;; (begin (display i)
;; (display "\n")
;; (loop (- i 1))))))
;; (loop 10))
;; *unspecified*)

View File

@ -0,0 +1 @@
(cdr '(0 . 1))

View File

@ -23,10 +23,10 @@
int int
test () test ()
{ {
int f;
int v = 3;
char *s = "mes"; char *s = "mes";
if (!s[0]) return 1; if (!s[0]) return 1;
int f;
int v = 3;
if (!s[f]) return 1; if (!s[f]) return 1;
if (s[3]) return 1; if (s[3]) return 1;
if (s[v]) return 1; if (s[v]) return 1;

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software * Mes --- Maxwell Equations of Software
* Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017 Jan Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of Mes. * This file is part of Mes.
* *

View File

@ -22,7 +22,9 @@ int
test () test ()
{ {
static int i = 1; static int i = 1;
return i--; static int foo = 0;
foo = 0;
return foo - i--;
} }
static int i = 2; static int i = 2;

View File

@ -26,6 +26,7 @@ main (int argc, char *argv[])
{ {
puts ("\n"); puts ("\n");
puts ("t: argv[0] == \"scaffold/test....\"\n"); puts ("t: argv[0] == \"scaffold/test....\"\n");
puts ("argv0="); puts (argv[0]); puts ("\n");
if (strncmp (argv[0], "scaffold/test", 5)) return 1; if (strncmp (argv[0], "scaffold/test", 5)) return 1;
puts ("t: *argv\"\n"); puts ("t: *argv\"\n");
@ -33,7 +34,7 @@ main (int argc, char *argv[])
puts ("\n"); puts ("\n");
puts ("t: if (argc > 1 && !strcmp (argv[1], \"--help\")\n"); puts ("t: if (argc > 1 && !strcmp (argv[1], \"--help\")\n");
if (argc > 1 && !strcmp (argv[1], "--help")) return 1; if (argc > 1 && !strcmp (argv[1], "--help")) return 2;
return 0; return 0;
} }

55
scaffold/tests/62-array.c Normal file
View File

@ -0,0 +1,55 @@
/* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software
* Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* This file is part of Mes.
*
* Mes 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 3 of the License, or (at
* your option) any later version.
*
* Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
int one_two_three[3] =
{
1, 2, 3
};
char *foo_bar_baz[3] =
{
"foo", "bar", "baz"
};
char foo_bar_baz_haha[3][4] =
{
"foo", "bar", "baz"
};
char *foo = "foo";
char *bar = "bar";
char *baz = "baz";
char *foo_bar_baz_mwhuhahaha[3] =
{
&foo, &bar, &baz
};
int
main ()
{
puts ("one:"); puts (itoa (one_two_three[0])); puts ("\n");
puts ("foo:"); puts (foo_bar_baz[1]); puts ("\n");
puts ("bar:"); puts (foo_bar_baz_haha[2]); puts ("\n");
char *p = foo_bar_baz_haha[2];
puts ("baz:"); puts (p); puts ("\n");
return strcmp (foo_bar_baz[2], "baz");
}

View File

@ -20,47 +20,47 @@
#include "30-test.i" #include "30-test.i"
#include <stdio.h> // #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> // #include <string.h>
int // int
add (int a, int b) // add (int a, int b)
{ // {
return a + b; // return a + b;
} // }
int // int
inc (int i) // inc (int i)
{ // {
return i + 1; // return i + 1;
} // }
struct scm { // struct scm {
int type; // int type;
int car; // int car;
int cdr; // int cdr;
}; // };
int bla = 1234; // int bla = 1234;
char g_arena[84]; // char g_arena[84];
#if __MESC__ // #if __MESC__
struct scm *g_cells = g_arena; // struct scm *g_cells = g_arena;
#else // #else
struct scm *g_cells = (struct scm*)g_arena; // struct scm *g_cells = (struct scm*)g_arena;
#endif // #endif
char *g_chars = g_arena; // char *g_chars = g_arena;
int foo () {puts ("t: foo\n"); return 0;}; // int foo () {puts ("t: foo\n"); return 0;};
int bar (int i) {puts ("t: bar\n"); return 0;}; // int bar (int i) {puts ("t: bar\n"); return 0;};
struct function { struct function {
int (*function) (void); int (*function) (void);
int arity; int arity;
char *name; char *name;
}; };
struct function g_fun = {&exit,1,"fun"}; struct function g_fun = {&exit,1,"fun"};
struct function g_foo = {&foo,0,"foo"}; // struct function g_foo = {&foo,0,"foo"};
struct function g_bar = {&bar,1,"bar"}; // struct function g_bar = {&bar,1,"bar"};
//void *functions[2]; //void *functions[2];
int functions[2]; int functions[2];
@ -68,181 +68,183 @@ int functions[2];
struct function g_functions[2]; struct function g_functions[2];
int g_function = 0; int g_function = 0;
enum type_t {TCHAR, TCLOSURE, TCONTINUATION, TFUNCTION, TKEYWORD, TMACRO, TNUMBER, TPAIR, TREF, TSPECIAL, TSTRING, TSYMBOL, TVALUES, TVECTOR, TBROKEN_HEART}; // enum type_t {TCHAR, TCLOSURE, TCONTINUATION, TFUNCTION, TKEYWORD, TMACRO, TNUMBER, TPAIR, TREF, TSPECIAL, TSTRING, TSYMBOL, TVALUES, TVECTOR, TBROKEN_HEART};
typedef int SCM; // typedef int SCM;
int g_free = 3; // int g_free = 3;
SCM tmp; // SCM tmp;
SCM tmp_num; // SCM tmp_num;
int ARENA_SIZE = 200; // int ARENA_SIZE = 200;
#define TYPE(x) g_cells[x].type // #define TYPE(x) g_cells[x].type
#define CAR(x) g_cells[x].car // #define CAR(x) g_cells[x].car
#define CDR(x) g_cells[x].cdr // #define CDR(x) g_cells[x].cdr
#define VALUE(x) g_cells[x].cdr // #define VALUE(x) g_cells[x].cdr
#define CAAR(x) CAR (CAR (x)) // #define CAAR(x) CAR (CAR (x))
struct scm scm_fun = {TFUNCTION,0,0}; // struct scm scm_fun = {TFUNCTION,0,0};
SCM cell_fun; // SCM cell_fun;
int int
test () test ()
{ {
puts ("\n"); // puts ("\n");
puts ("t: g_cells[0] = g_cells[1]\n"); // puts ("t: g_cells[0] = g_cells[1]\n");
TYPE (1) = 1; // TYPE (1) = 1;
CAR (1) = 2; // CAR (1) = 2;
CDR (1) = 3; // CDR (1) = 3;
g_cells[0] = g_cells[1]; // g_cells[0] = g_cells[1];
if (TYPE (0) != 1) return 1; // if (TYPE (0) != 1) return 1;
if (CAR (0) != 2) return 2; // if (CAR (0) != 2) return 2;
if (CDR (0) != 3) return 3; // if (CDR (0) != 3) return 3;
puts ("t: g_cells[i] = g_cells[j]\n"); // puts ("t: g_cells[i] = g_cells[j]\n");
int i = 0; // int i = 0;
int j = 1; // int j = 1;
TYPE (1) = 4; // TYPE (1) = 4;
CAR (1) = 5; // CAR (1) = 5;
CDR (1) = 6; // CDR (1) = 6;
g_cells[i] = g_cells[j]; // g_cells[i] = g_cells[j];
if (TYPE (0) != 4) return 1; // if (TYPE (0) != 4) return 1;
if (CAR (0) != 5) return 2; // if (CAR (0) != 5) return 2;
if (CDR (0) != 6) return 3; // if (CDR (0) != 6) return 3;
puts ("t: g_cells[0+add(0,0] = g_cells[0+inc(0)]\n"); // puts ("t: g_cells[0+add(0,0] = g_cells[0+inc(0)]\n");
TYPE (1) = 1; // TYPE (1) = 1;
CAR (1) = 2; // CAR (1) = 2;
CDR (1) = 3; // CDR (1) = 3;
g_cells[0+add(0, 0)] = g_cells[0+inc(0)]; // g_cells[0+add(0, 0)] = g_cells[0+inc(0)];
if (TYPE (0) != 1) return 1; // if (TYPE (0) != 1) return 1;
if (CAR (0) != 2) return 2; // if (CAR (0) != 2) return 2;
if (CDR (0) != 3) return 3; // if (CDR (0) != 3) return 3;
g_cells[0].type = TNUMBER; // g_cells[0].type = TNUMBER;
g_cells[0].car = 0; // g_cells[0].car = 0;
g_cells[0].cdr = 0; // g_cells[0].cdr = 0;
g_cells[1].type = TNUMBER; // g_cells[1].type = TNUMBER;
g_cells[1].car = 0; // g_cells[1].car = 0;
g_cells[1].cdr = 0; // g_cells[1].cdr = 0;
puts ("t: TYPE (0) != TYPE (1)\n"); // puts ("t: TYPE (0) != TYPE (1)\n");
if (TYPE (0) == TYPE (1)) goto ok; // if (TYPE (0) == TYPE (1)) goto ok;
return 1; // return 1;
ok: // ok:
g_cells[0].car = 1; // g_cells[0].car = 1;
g_cells[1].car = 2; // g_cells[1].car = 2;
puts ("t: int c = VALUE (0)\n"); // puts ("t: int c = VALUE (0)\n");
int c = CAR (0); // int c = CAR (0);
if (c != 1) return 1; // if (c != 1) return 1;
puts ("t: CAAR (0) != 2\n"); // puts ("t: CAAR (0) != 2\n");
if (CAAR (0) != 2) return 1; // if (CAAR (0) != 2) return 1;
puts ("t: 2 != CAAR (0)\n"); // puts ("t: 2 != CAAR (0)\n");
if (2 != CAAR (0)) return 1; // if (2 != CAAR (0)) return 1;
g_cells[3].type = 0x64; // g_cells[3].type = 0x64;
if (g_cells[3].type != 0x64) // if (g_cells[3].type != 0x64)
return g_cells[3].type; // return g_cells[3].type;
TYPE (4) = 4; // TYPE (4) = 4;
if (TYPE (4) != 4) // if (TYPE (4) != 4)
return 4; // return 4;
CDR (3) = 0x22; // CDR (3) = 0x22;
CDR (4) = 0x23; // CDR (4) = 0x23;
if (CDR (3) != 0x22) // if (CDR (3) != 0x22)
return CDR (3); // return CDR (3);
puts ("t: g_fun.arity != 1;\n"); // puts ("t: g_fun.arity != 1;\n");
if (g_fun.arity != 1) return 1; // if (g_fun.arity != 1) return 1;
puts ("t: g_fun.function != exit;\n"); // puts ("t: g_fun.function != exit;\n");
if (g_fun.function != &exit) return 1; // if (g_fun.function != &exit) return 1;
puts ("t: struct fun = {&exit,1,\"exit\"};\n"); // puts ("t: struct fun = {&exit,1,\"exit\"};\n");
struct function fun = {&exit,1,"exit"}; // struct function fun = {&exit,1,"exit"};
puts ("t: fun.arity != 1;\n"); // puts ("t: fun.arity != 1;\n");
if (fun.arity != 1) return 1; // if (fun.arity != 1) return 1;
puts ("t: fun.function != exit;\n"); // puts ("t: fun.function != exit;\n");
if (fun.function != &exit) return 1; // if (fun.function != &exit) return 1;
puts ("t: puts (fun.name)\n"); // puts ("t: puts (fun.name)\n");
if (strcmp (fun.name, "exit")) return 1; // if (strcmp (fun.name, "exit")) return 1;
puts ("t: puts (g_fun.name)\n"); // puts ("t: puts (g_fun.name)\n");
if (strcmp (g_fun.name, "fun")) return 1; // if (strcmp (g_fun.name, "fun")) return 1;
puts ("t: g_functions[g_function++] = g_foo;\n"); // puts ("t: g_functions[g_function++] = g_foo;\n");
g_functions[g_function++] = g_foo; // g_functions[g_function++] = g_foo;
puts ("t: pbar->arity == 1\n"); // puts ("t: pbar->arity == 1\n");
struct function* barp = &g_bar; // struct function* barp = &g_bar;
if (barp->arity != 1) return 1; // if (barp->arity != 1) return 1;
int fn = 0; // int fn = 0;
puts ("t: g_functions[g_cells[fn].cdr].arity\n"); // puts ("t: g_functions[g_cells[fn].cdr].arity\n");
if (g_functions[g_cells[fn].cdr].arity) return 1; // if (g_functions[g_cells[fn].cdr].arity) return 1;
if (g_functions[g_cells[fn].cdr].arity != 0) return 1; // if (g_functions[g_cells[fn].cdr].arity != 0) return 1;
int (*functionx) (void) = 0; // int (*functionx) (void) = 0;
functionx = g_functions[0].function; // functionx = g_functions[0].function;
puts ("t: functionx == foo\n"); // puts ("t: functionx == foo\n");
if (functionx != foo) return 11; // if (functionx != foo) return 11;
puts ("t: g_functions[0].name\n"); // puts ("t: g_functions[0].name\n");
if (strcmp (g_functions[0].name, "foo")) return 1; // if (strcmp (g_functions[0].name, "foo")) return 1;
puts ("t: (functionx) () == foo\n"); // puts ("t: (functionx) () == foo\n");
if ((functionx) () != 0) return 12; // if ((functionx) () != 0) return 12;
puts ("t: g_functions[<foo>].arity\n"); // puts ("t: g_functions[<foo>].arity\n");
if (g_functions[0].arity != 0) return 17; // if (g_functions[0].arity != 0) return 17;
fn++; // fn++;
g_functions[fn] = g_bar; // g_functions[fn] = g_bar;
g_cells[fn].cdr = fn; // g_cells[fn].cdr = fn;
if (g_cells[fn].cdr != fn) return 13; // if (g_cells[fn].cdr != fn) return 13;
puts ("t: g_functions[g_cells[fn].cdr].function\n"); // puts ("t: g_functions[g_cells[fn].cdr].function\n");
functionx = g_functions[g_cells[fn].cdr].function; // functionx = g_functions[g_cells[fn].cdr].function;
puts ("t: g_functions[1].name\n"); // puts ("t: g_functions[1].name\n");
if (strcmp (g_functions[1].name, "bar")) return 1; // if (strcmp (g_functions[1].name, "bar")) return 1;
puts ("t: functionx == bar\n"); // puts ("t: functionx == bar\n");
if (functionx != bar) return 15; // if (functionx != bar) return 15;
puts ("t: (functiony) (1) == bar\n"); // puts ("t: (functiony) (1) == bar\n");
int (*functiony) (int) = 0; // int (*functiony) (int) = 0;
functiony = g_functions[g_cells[fn].cdr].function; // functiony = g_functions[g_cells[fn].cdr].function;
if ((functiony) (1) != 0) return 16; // if ((functiony) (1) != 0) return 16;
puts ("t: g_functions[<bar>].arity\n"); // puts ("t: g_functions[<bar>].arity\n");
if (g_functions[fn].arity != 1) return 18; // if (g_functions[fn].arity != 1) return 18;
// fake name // // fake name
scm_fun.car = 33; // scm_fun.car = 33;
scm_fun.cdr = g_function; // scm_fun.cdr = g_function;
//g_functions[g_function++] = g_fun; // //g_functions[g_function++] = g_fun;
g_function++;
puts ("fun");
g_functions[g_function] = g_fun; g_functions[g_function] = g_fun;
cell_fun = g_free++; // cell_fun = g_free++;
g_cells[cell_fun] = scm_fun; // g_cells[cell_fun] = scm_fun;
puts ("t: TYPE (cell_fun)\n"); // puts ("t: TYPE (cell_fun)\n");
if (TYPE (cell_fun) != TFUNCTION) return 1; // if (TYPE (cell_fun) != TFUNCTION) return 1;
puts ("t: CAR (cell_fun)\n"); // puts ("t: CAR (cell_fun)\n");
if (CAR (cell_fun) != 33) return 1; // if (CAR (cell_fun) != 33) return 1;
puts ("t: CDR (cell_fun)\n"); // puts ("t: CDR (cell_fun)\n");
if (CDR (cell_fun) != g_function) return 1; // if (CDR (cell_fun) != g_function) return 1;
return 0; return 0;
} }

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software * Mes --- Maxwell Equations of Software
* Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of Mes. * This file is part of Mes.
* *
@ -34,13 +34,14 @@ test ()
sprintf (buf, "c=%c\n", c); sprintf (buf, "c=%c\n", c);
if (strcmp (buf, "c=m\n")) return 1; if (strcmp (buf, "c=m\n")) return 1;
if (i != 3) return 15;
printf ("i=%d\n", i); printf ("i=%d\n", i);
sprintf (buf, "i=%d\n", i); sprintf (buf, "i=%d\n", i);
if (strcmp (buf, "i=3\n")) return 1; if (strcmp (buf, "i=3\n")) return 2;
printf ("s=%s\n", s); printf ("s=%s\n", s);
sprintf (buf, "s=%s\n", s); sprintf (buf, "s=%s\n", s);
if (strcmp (buf, "s=mes\n")) return 1; if (strcmp (buf, "s=mes\n")) return 3;
return 0; return 0;
} }

View File

@ -69,6 +69,8 @@ test ()
char *strings[] = { "one\n", "two\n", "three\n", NULL }; char *strings[] = { "one\n", "two\n", "three\n", NULL };
char **p = strings; char **p = strings;
while (*p) puts (*p++); while (*p) puts (*p++);
if (strcmp (strings[1], "two\n"))
return 3;
strcpy (f.name, "hallo\n"); strcpy (f.name, "hallo\n");
puts (f.name); puts (f.name);

View File

@ -54,9 +54,9 @@ test ()
struct anon a = {3,4}; struct anon a = {3,4};
a.baz = 4; // FIXME a.baz = 4; // FIXME
printf ("a.bar=%d\n", a.bar); printf ("a.bar=%d\n", a.bar);
if (a.bar != 3) return 1; if (a.bar != 3) return 3;
printf ("a.baz=%d\n", a.baz); printf ("a.baz=%d\n", a.baz);
if (a.baz != 4) return 1; if (a.baz != 4) return 4;
return 0; return 0;
} }

View File

@ -0,0 +1,13 @@
int
main ()
{
static void *lbl = &&lbl_b;
goto *lbl;
lbl_a:
return 1;
lbl_b:
return 0;
}

View File

@ -0,0 +1,34 @@
#include <stdio.h>
int main(void) {
static void *lbls[] = { &&lbl_h, &&lbl_e, &&lbl_l, &&lbl_l, &&lbl_o, &&lbl_quit };
static void **lbl = lbls;
goto **lbl;
lbl_e:
printf("e");
lbl++;
goto **lbl;
lbl_o:
printf("o");
lbl++;
goto **lbl;
lbl_h:
printf("h");
lbl++;
goto **lbl;
lbl_l:
printf("l");
lbl++;
goto **lbl;
lbl_quit:
puts("");
return 0;
}

View File

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software * Mes --- Maxwell Equations of Software
* Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of Mes. * This file is part of Mes.
* *
@ -18,30 +18,102 @@
* along with Mes. If not, see <http://www.gnu.org/licenses/>. * along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "30-test.i"
char g_arena[4] = "XXX"; int puts (char const*);
char *g_chars = g_arena; #include <string.h>
char global_arena[10];
int global_i = 1;
int global_unitialized;
char* global_string = "foo";
char global_array[8] = "XXX";
char *global_chars = global_array;
typedef int SCM;
enum type_t {TCHAR};
char *env[] = {"foo", "bar", "baz", 0};
char *list[2] = {"foo\n", "bar\n"};
struct foo {int length; char* string;};
struct foo f = {3, "foo"};
struct foo g_foes[2];
int g_foe;
struct anon {struct {int bar; int baz;};};
struct here {int and;} there;
int int
test () main (int argc, char* argv[])
{ {
puts ("X\n"); int i;
if (*g_chars != 'X') return 1; int j = 1;
g_arena[0] = 'A'; int k, l = 1;
puts ("A\n"); if (j != 1)
if (*g_chars != 'A') return 1; return 1;
if (l != 1)
return 2;
if (global_i != 1)
return 3;
global_arena[1] = 0;
if (global_i != 1)
return 4;
if (global_unitialized != 0)
return 5;
if (strcmp (global_string, "foo"))
return 6;
char *s = "bar";
if (strcmp (s, "bar"))
return 7;
if (*global_array != 'X')
return 8;
if (*global_chars != 'X')
return 9;
SCM x = 0;
if (x != 0)
return 9;
if (TCHAR != 0)
return 11;
if (strncmp (argv[0], "scaffold/test", 5))
return 12;
if (strcmp (env[0], "foo"))
return 13;
if (strcmp (env[2], "baz"))
return 14;
if (env[3])
return 15;
if (f.length != 3)
return 16;
if (strcmp (f.string, "foo"))
return 17;
struct foo g = {4, "baar"};
if (g.length != 4)
return 16;
if (strcmp (g.string, "baar"))
return 18;
struct foo f = {3, "foo"};
g_foes[0] = f;
g_foes[1] = f;
if (g_foe)
return 19;
char *strings[] = { "one\n", "two\n", "three\n", 0 };
char **p = strings;
while (*p) puts (*p++);
if (strcmp (strings[1], "two\n"))
return 20;
p = list;
struct anon a = {3,4};
eputs ("bar:"); eputs (itoa (a.bar)); eputs ("\n");
eputs ("baz:"); eputs (itoa (a.baz)); eputs ("\n");
if (a.bar != 3) return 1;
if (a.baz != 4) return 2;
puts ("*x A\n"); i = 1;
char *x = g_arena; int lst[6] = {-1, 1 - 1, i, 2, 3};
if (*x != 'A') return 1; for (int i = 0; i < 4; i++)
{
puts ("*x++ A\n"); puts ("i: "); puts (itoa (lst[i])); puts ("\n");
if (*x++ != 'A') return 1; if (lst[i+1] != i)
return i;
puts ("t: *x++ != 'C'\n"); }
*x++ = 'C';
if (g_chars[1] != 'C') return 1;
return 0; return 0;
} }