1
/*===========================================================================
5
* Copyright (C) 2005-2006 Kazuki Ohta <mover AT hct.zaq.ne.jp>
9
* Redistribution and use in source and binary forms, with or without
10
* modification, are permitted provided that the following conditions
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
* 3. Neither the name of authors nor the names of its contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
22
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
23
* IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
26
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
29
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
31
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
32
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
===========================================================================*/
37
/*=======================================
39
=======================================*/
41
/*=======================================
43
=======================================*/
44
#include "sigscheme.h"
45
#include "sigschemeinternal.h"
47
/*=======================================
48
File Local Struct Declarations
49
=======================================*/
51
/*=======================================
52
File Local Macro Declarations
53
=======================================*/
55
/*=======================================
57
=======================================*/
59
/*=======================================
60
File Local Function Declarations
61
=======================================*/
63
/*=======================================
64
Function Implementations
65
=======================================*/
66
/*===========================================================================
67
R5RS : 6.3 Other data types : 6.3.6 Vectors
68
===========================================================================*/
70
scm_p_vectorp(ScmObj obj)
72
DECLARE_FUNCTION("vector?", procedure_fixed_1);
74
return MAKE_BOOL(VECTORP(obj));
78
scm_p_make_vector(ScmObj scm_len, ScmObj args)
82
DECLARE_FUNCTION("make-vector", procedure_variadic_1);
86
len = SCM_INT_VALUE(scm_len);
88
ERR_OBJ("length must be a positive integer", scm_len);
90
vec = scm_malloc(sizeof(ScmObj) * len);
95
ASSERT_NO_MORE_ARG(args);
97
for (i = 0; i < len; i++)
100
return MAKE_VECTOR(vec, len);
104
scm_p_vector(ScmObj args)
106
DECLARE_FUNCTION("vector", procedure_variadic_0);
108
return scm_p_list2vector(args);
112
scm_p_vector_length(ScmObj vec)
114
DECLARE_FUNCTION("vector-length", procedure_fixed_1);
118
return MAKE_INT(SCM_VECTOR_LEN(vec));
122
scm_p_vector_ref(ScmObj vec, ScmObj _k)
125
DECLARE_FUNCTION("vector-ref", procedure_fixed_2);
130
k = SCM_INT_VALUE(_k);
132
if (!SCM_VECTOR_VALID_INDEXP(vec, k))
133
ERR_OBJ("index out of range", _k);
135
return SCM_VECTOR_VEC(vec)[k];
139
scm_p_vector_setd(ScmObj vec, ScmObj _k, ScmObj obj)
142
DECLARE_FUNCTION("vector-set!", procedure_fixed_3);
145
#if SCM_CONST_VECTOR_LITERAL
146
ENSURE_MUTABLE_VECTOR(vec);
150
k = SCM_INT_VALUE(_k);
152
if (!SCM_VECTOR_VALID_INDEXP(vec, k))
153
ERR_OBJ("index out of range", _k);
155
SCM_VECTOR_VEC(vec)[k] = obj;
161
scm_p_vector2list(ScmObj vec)
166
DECLARE_FUNCTION("vector->list", procedure_fixed_1);
170
v = SCM_VECTOR_VEC(vec);
171
len = SCM_VECTOR_LEN(vec);
174
SCM_QUEUE_POINT_TO(q, ret);
175
for (i = 0; i < len; i++)
176
SCM_QUEUE_ADD(q, v[i]);
182
scm_p_list2vector(ScmObj lst)
186
DECLARE_FUNCTION("list->vector", procedure_fixed_1);
188
len = scm_length(lst);
189
if (!SCM_LISTLEN_PROPERP(len))
190
ERR_OBJ("proper list required but got", lst);
192
vec = scm_malloc(sizeof(ScmObj) * len);
193
for (i = 0; i < len; i++)
196
return MAKE_VECTOR(vec, len);
200
scm_p_vector_filld(ScmObj vec, ScmObj fill)
204
DECLARE_FUNCTION("vector-fill!", procedure_fixed_2);
207
#if SCM_CONST_VECTOR_LITERAL
208
ENSURE_MUTABLE_VECTOR(vec);
211
v = SCM_VECTOR_VEC(vec);
212
len = SCM_VECTOR_LEN(vec);
213
for (i = 0; i < len; i++)