Skip to content

Commit 9ed5c84

Browse files
committed
POC #972 use FullDefiniton,Save,Get
TODO - `FullDefinition` must recursively determine all non-`Protected` symbol definitions - `Definition`, `FullDefinition` must contain an empty line between any singular definition line to use the `Package` parser in the `Get` function - `FullDefinition(In)` can be used to get all input definitions
1 parent 4185e86 commit 9ed5c84

File tree

8 files changed

+1725
-1547
lines changed

8 files changed

+1725
-1547
lines changed

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/builtin/FileFunctions.java

+41-1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ private static void init() {
9494
S.Put.setEvaluator(new Put());
9595
S.Read.setEvaluator(new Read());
9696
S.ReadString.setEvaluator(new ReadString());
97+
S.Save.setEvaluator(new Save());
9798
S.StringToStream.setEvaluator(new StringToStream());
9899
S.URLFetch.setEvaluator(new URLFetch());
99100
S.Write.setEvaluator(new Write());
@@ -872,7 +873,8 @@ public IExpr evaluate(final IAST ast, EvalEngine engine) {
872873

873874
final int argSize = ast.argSize();
874875
if (!(ast.last() instanceof IStringX)) {
875-
return Errors.printMessage(S.Put, "string", F.List(), engine);
876+
// String expected at position `1` in `2`.
877+
return Errors.printMessage(S.Put, "string", F.List(F.ZZ(argSize), ast), engine);
876878
}
877879
IStringX fileName = (IStringX) ast.last();
878880

@@ -1186,6 +1188,44 @@ public int[] expectedArgSize(IAST ast) {
11861188
}
11871189
}
11881190

1191+
private static final class Save extends AbstractFunctionEvaluator {
1192+
1193+
@Override
1194+
public IExpr evaluate(final IAST ast, EvalEngine engine) {
1195+
if (Config.isFileSystemEnabled(engine)) {
1196+
1197+
if (!(ast.arg1() instanceof IStringX)) {
1198+
// String expected at position `1` in `2`.
1199+
return Errors.printMessage(S.Save, "string", F.List(F.C1, ast), engine);
1200+
}
1201+
IStringX fileName = (IStringX) ast.arg1();
1202+
IExpr arg2 = ast.arg2();
1203+
StringBuilder buf = new StringBuilder();
1204+
if (arg2.isSymbol()) {
1205+
buf.append(((ISymbol) arg2).definition());
1206+
}
1207+
try (FileWriter writer = new FileWriter(fileName.toString())) {
1208+
writer.write(buf.toString());
1209+
} catch (IOException e) {
1210+
LOGGER.log(engine.getLogLevel(), "Save: file {} I/O exception !", fileName, e);
1211+
return F.NIL;
1212+
}
1213+
return S.Null;
1214+
}
1215+
return F.NIL;
1216+
}
1217+
1218+
@Override
1219+
public int[] expectedArgSize(IAST ast) {
1220+
return ARGS_2_2;
1221+
}
1222+
1223+
@Override
1224+
public void setUp(ISymbol newSymbol) {
1225+
newSymbol.setAttributes(ISymbol.HOLDREST);
1226+
}
1227+
}
1228+
11891229
private static final class StringToStream extends AbstractFunctionEvaluator {
11901230

11911231
@Override

symja_android_library/matheclipse-core/src/main/java/org/matheclipse/core/builtin/PatternMatching.java

+68
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ private static void init() {
9393
S.ClearAll.setEvaluator(new ClearAll());
9494
S.Context.setEvaluator(new Context());
9595
S.Definition.setEvaluator(new Definition());
96+
S.FullDefinition.setEvaluator(new FullDefinition());
9697
S.OptionsPattern.setEvaluator(OptionsPattern.CONST);
9798
S.OwnValues.setEvaluator(new OwnValues());
9899
S.Repeated.setEvaluator(Repeated.CONST);
@@ -722,6 +723,73 @@ public int[] expectedArgSize(IAST ast) {
722723
}
723724
}
724725

726+
private static final class FullDefinition extends AbstractCoreFunctionEvaluator {
727+
728+
@Override
729+
public IExpr evaluate(final IAST ast, EvalEngine engine) {
730+
// TODO copied from Definition. Implement FullDefinition details.
731+
IExpr arg1 = Validate.checkSymbolType(ast, 1, engine);
732+
if (arg1.isPresent()) {
733+
ISymbol symbol = (ISymbol) arg1;
734+
try {
735+
String definitionString;
736+
if (symbol.equals(S.In)) {
737+
IAST list = engine.getEvalHistory().definitionIn();
738+
definitionString = definitionToString(S.In, list);
739+
} else if (symbol.equals(S.Out)) {
740+
IAST list = engine.getEvalHistory().definitionOut();
741+
definitionString = definitionToString(S.Out, list);
742+
} else {
743+
definitionString = symbol.definitionToString();
744+
}
745+
return F.stringx(definitionString);
746+
} catch (IOException ioe) {
747+
return Errors.printMessage(S.Definition, ioe, engine);
748+
}
749+
}
750+
return S.Null;
751+
}
752+
753+
@Override
754+
public int[] expectedArgSize(IAST ast) {
755+
return ARGS_1_1;
756+
}
757+
758+
@Override
759+
public void setUp(ISymbol newSymbol) {
760+
newSymbol.setAttributes(ISymbol.HOLDALL);
761+
}
762+
763+
public static String definitionToString(ISymbol symbol, IAST list) {
764+
765+
StringWriter buf = new StringWriter();
766+
IAST attributesList = AttributeFunctions.attributesList(symbol);
767+
if (attributesList.size() > 1) {
768+
buf.append("Attributes(");
769+
buf.append(symbol.toString());
770+
buf.append(")=");
771+
buf.append(attributesList.toString());
772+
buf.append("\n");
773+
}
774+
775+
EvalEngine engine = EvalEngine.get();
776+
OutputFormFactory off = OutputFormFactory.get(engine.isRelaxedSyntax());
777+
off.setIgnoreNewLine(true);
778+
779+
// IAST list = definition();
780+
for (int i = 1; i < list.size(); i++) {
781+
if (!off.convert(buf, list.get(i))) {
782+
return "ERROR-IN-OUTPUTFORM";
783+
}
784+
if (i < list.size() - 1) {
785+
buf.append("\n");
786+
off.setColumnCounter(0);
787+
}
788+
}
789+
return buf.toString();
790+
}
791+
}
792+
725793

726794
/**
727795
*

0 commit comments

Comments
 (0)