Skip to content

Commit

Permalink
* compile.[ch]: support for lambda()
Browse files Browse the repository at this point in the history
* PROTO.h, mymalloc.h: added #ifdefs for TURBOC and GNUC.
* allobjects.h: added #include "rangeobject.h"
* Grammar: added lambda_input; relaxed syntax for exec.
* bltinmodule.c: added bagof, map, reduce, lambda, xrange.
* tupleobject.[ch]: added resizetuple().
* rangeobject.[ch]: new object type to speed up range operations (not
  convinced this is needed!!!)
  • Loading branch information
gvanrossum committed Oct 26, 1993
1 parent 444fc7c commit 12d12c5
Show file tree
Hide file tree
Showing 12 changed files with 1,641 additions and 708 deletions.
10 changes: 7 additions & 3 deletions Grammar/Grammar
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

# Change log:

# 25-Oct-93:
# Added lambda_input

# 18-Oct-93:
# Use testlist instead of exprlist in expr_stmt
# Add exec statement
Expand Down Expand Up @@ -75,13 +78,14 @@
# single_input is a single interactive statement;
# file_input is a module or sequence of commands read from an input file;
# expr_input is the input for the input() function;
# eval_input is the input for the eval() function.
# eval_input is the input for the eval() function;
# lambda_input is the input for the proposed lambda() function.

# NB: compound_stmt in single_input is followed by extra NEWLINE!
single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
file_input: (NEWLINE | stmt)* ENDMARKER
expr_input: testlist NEWLINE
eval_input: testlist NEWLINE* ENDMARKER
lambda_input: varargslist ':' testlist NEWLINE* ENDMARKER

funcdef: 'def' NAME parameters ':' suite
parameters: '(' [varargslist] ')'
Expand All @@ -108,7 +112,7 @@ access_stmt: 'access' ('*' | NAME (',' NAME)*) ':' accesstype (',' accesstype)*
accesstype: NAME+
# accesstype should be ('public' | 'protected' | 'private') ['read'] ['write']
# but can't be because that would create undesirable reserved words!
exec_stmt: 'exec' expr ['in' expr [',' expr]]
exec_stmt: 'exec' expr ['in' test [',' test]]

compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
Expand Down
1 change: 1 addition & 0 deletions Include/allobjects.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "intobject.h"
#include "longobject.h"
#include "floatobject.h"
#include "rangeobject.h"
#include "stringobject.h"
#include "tupleobject.h"
#include "listobject.h"
Expand Down
4 changes: 3 additions & 1 deletion Include/compile.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,12 @@ extern typeobject Codetype;

/* Public interface */
struct _node; /* Declare the existence of this type */
codeobject *compile PROTO((struct _node *, char *));
codeobject *_compile PROTO((struct _node *, char *, int));
codeobject *newcodeobject
PROTO((object *, object *, object *, object *, object *));

#define compile(n,f) (_compile((n),(f),0))

#ifdef __cplusplus
}
#endif
Expand Down
4 changes: 2 additions & 2 deletions Include/graminit.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#define single_input 256
#define file_input 257
#define expr_input 258
#define eval_input 259
#define eval_input 258
#define lambda_input 259
#define funcdef 260
#define parameters 261
#define varargslist 262
Expand Down
10 changes: 10 additions & 0 deletions Include/mymalloc.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,16 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#define HAVE_STDLIB
#endif

#ifdef __TURBOC__
#define ANY void
#define HAVE_STDLIB
#endif

#ifdef __GNUC__
#define ANY void
#define HAVE_STDLIB
#endif

#ifndef ANY
#define ANY char
#endif
Expand Down
41 changes: 41 additions & 0 deletions Include/rangeobject.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/***********************************************************
Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
Amsterdam, The Netherlands.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/

/* Range object interface */

/*
123456789-123456789-123456789-123456789-123456789-123456789-123456789-12
rangeobject represents an integer range. This is an immutable object;
a range cannot change its value after creation.
Range objects behave like the corresponding tuple objects except that
they are represented by a start, stop, and step datamembers.
*/

extern typeobject Rangetype;

#define is_rangeobject(op) ((op)->ob_type == &Rangetype)

extern object *newrangeobject PROTO((long, long, long, int));
1 change: 1 addition & 0 deletions Include/tupleobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ extern int gettuplesize PROTO((object *));
extern object *gettupleitem PROTO((object *, int));
extern int settupleitem PROTO((object *, int, object *));
extern object *gettupleslice PROTO((object *, int, int));
extern int resizetuple PROTO((object **, int));

/* Macro, trading safety for speed */
#define GETTUPLEITEM(op, i) ((op)->ob_item[i])
Expand Down
205 changes: 205 additions & 0 deletions Objects/rangeobject.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
/***********************************************************
Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
Amsterdam, The Netherlands.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.
STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
******************************************************************/

/* Range object implementation */

#include "allobjects.h"

typedef struct {
OB_HEAD
long start;
long step;
long len;
int reps;
} rangeobject;


object *
newrangeobject(start, len, step, reps)
long start, len, step;
int reps;
{
rangeobject *obj = (rangeobject *) newobject(&Rangetype);

obj->start = start;
obj->len = len;
obj->step = step;
obj->reps = reps;

return (object *) obj;
}

static void
range_dealloc(r)
rangeobject *r;
{
DEL(r);
}

static object *
range_item(r, i)
rangeobject *r;
int i;
{
if (i < 0 || i >= r->len * r->reps) {
err_setstr(IndexError, "range object index out of range");
return NULL;
}

return newintobject(r->start + (i % r->len) * r->step);
}

static int
range_length(r)
rangeobject *r;
{
return r->len * r->reps;
}

static object *
range_repr(r)
rangeobject *r;
{
char buf[80];
if (r->reps != 1)
sprintf(buf, "(xrange(%ld, %ld, %ld) * %d)",
r->start,
r->start + r->len * r->step,
r->step,
r->reps);
else
sprintf(buf, "xrange(%ld, %ld, %ld)",
r->start,
r->start + r->len * r->step,
r->step);
return newstringobject(buf);
}

object *
range_concat(r, obj)
rangeobject *r;
object *obj;
{
if (is_rangeobject(obj)) {
rangeobject *s = (rangeobject *)obj;
if (r->start == s->start && r->len == s->len &&
r->step == s->step)
return newrangeobject(r->start, r->len, r->step,
r->reps + s->reps);
}
err_setstr(TypeError, "cannot concatenate different range objects");
return NULL;
}

object *
range_repeat(r, n)
rangeobject *r;
int n;
{
if (n < 0)
return (object *) newrangeobject(0, 0, 1, 1);

else if (n == 1) {
INCREF(r);
return (object *) r;
}

else
return (object *) newrangeobject(
r->start,
r->len,
r->step,
r->reps * n);
}

static int
range_compare(r1, r2)
rangeobject *r1, *r2;
{
if (r1->start != r2->start)
return r1->start - r2->start;

else if (r1->step != r2->step)
return r1->step - r2->step;

else if (r1->len != r2->len)
return r1->len - r2->len;

else
return r1->reps - r2->reps;
}

static object *
range_slice(r, low, high)
rangeobject *r;
int low, high;
{
if (r->reps != 1) {
err_setstr(TypeError, "cannot slice a replicated range");
return NULL;
}
if (low < 0)
low = 0;
else if (low > r->len)
low = r->len;
if (high < 0)
high = 0;
if (high < low)
high = low;
else if (high > r->len)
high = r->len;

return (object *) newrangeobject(
low * r->step + r->start,
high - low,
r->step,
1);
}

static sequence_methods range_as_sequence = {
range_length, /*sq_length*/
range_concat, /*sq_concat*/
range_repeat, /*sq_repeat*/
range_item, /*sq_item*/
range_slice, /*sq_slice*/
0, /*sq_ass_item*/
0, /*sq_ass_slice*/
};

typeobject Rangetype = {
OB_HEAD_INIT(&Typetype)
0, /* Number of items for varobject */
"range", /* Name of this type */
sizeof(rangeobject), /* Basic object size */
0, /* Item size for varobject */
range_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
range_compare, /*tp_compare*/
range_repr, /*tp_repr*/
0, /*tp_as_number*/
&range_as_sequence, /*tp_as_sequence*/
0, /*tp_as_mapping*/
};
Loading

0 comments on commit 12d12c5

Please sign in to comment.