@@ -276,13 +276,9 @@ public IAST definition() {
276
276
@ Override
277
277
public IAST fullDefinition () {
278
278
Set <ISymbol > symbolSet = new HashSet <ISymbol >();
279
- IAST rules = definition ();
280
- for (int i = 1 ; i < rules .size (); i ++) {
281
- IExpr rule = rules .get (i );
282
- collectSymbolsRecursive (rule , symbolSet , x -> x .isSymbol () && !(x .isProtected ()));
283
- }
279
+ collectSymbolsRecursive (this , symbolSet , x -> x .isSymbol () && !(x .isProtected ()));
284
280
if (symbolSet .size () > 0 ) {
285
- IASTAppendable fullDefinition = F .ListAlloc (rules . size () + symbolSet . size () );
281
+ IASTAppendable fullDefinition = F .ListAlloc ();
286
282
Iterator <ISymbol > iterator = symbolSet .iterator ();
287
283
while (iterator .hasNext ()) {
288
284
ISymbol symbol = iterator .next ();
@@ -299,26 +295,43 @@ public IAST fullDefinition() {
299
295
return F .NIL ;
300
296
}
301
297
298
+ private static void collectSymbolsRecursive (ISymbol symbol , Set <ISymbol > symbolSet ,
299
+ Predicate <ISymbol > predicate ) {
300
+ final IAST rules = symbol .definition ();
301
+ for (int i = 1 ; i < rules .size (); i ++) {
302
+ IExpr rule = rules .get (i );
303
+ collectSymbolsRecursive (rule , symbolSet , predicate );
304
+ }
305
+ }
306
+
302
307
private static void collectSymbolsRecursive (IExpr expr , Set <ISymbol > symbolSet ,
303
308
Predicate <ISymbol > predicate ) {
304
309
if (expr .isAST ()) {
305
310
IAST list = (IAST ) expr ;
306
311
IExpr head = expr .head ();
307
312
if (head .isSymbol ()) {
308
- if (predicate .test ((ISymbol ) head )) {
309
- symbolSet .add ((ISymbol ) head );
313
+ final ISymbol symbol = (ISymbol ) head ;
314
+ if (predicate .test (symbol )) {
315
+ if (!symbolSet .contains (symbol )) {
316
+ symbolSet .add (symbol );
317
+ collectSymbolsRecursive (symbol , symbolSet , predicate );
318
+ }
310
319
}
311
320
} else {
312
- collectSymbolsRecursive (head , symbolSet , x -> x . isSymbol () );
321
+ collectSymbolsRecursive (head , symbolSet , predicate );
313
322
}
314
323
for (int i = 1 ; i < list .size (); i ++) {
315
324
IExpr arg = list .getRule (i );
316
325
collectSymbolsRecursive (arg , symbolSet , predicate );
317
326
}
318
327
} else {
319
328
if (expr .isSymbol ()) {
320
- if (predicate .test ((ISymbol ) expr )) {
321
- symbolSet .add ((ISymbol ) expr );
329
+ final ISymbol symbol = (ISymbol ) expr ;
330
+ if (predicate .test (symbol )) {
331
+ if (!symbolSet .contains (symbol )) {
332
+ symbolSet .add (symbol );
333
+ collectSymbolsRecursive (symbol , symbolSet , predicate );
334
+ }
322
335
}
323
336
}
324
337
}
0 commit comments