Repository: grzegorzmazur/yacas
Branch: master
Commit: 7df0c6751901
Files: 602
Total size: 10.5 MB
Directory structure:
gitextract_ep2z9l5r/
├── .clang-format
├── .gitignore
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── AUTHORS
├── CMakeLists.txt
├── CODE_OF_CONDUCT.md
├── COPYING
├── ChangeLog
├── README.rst
├── TODO
├── appveyor.yml
├── build.xml
├── cyacas/
│ ├── CMakeLists.txt
│ ├── libyacas/
│ │ ├── CMakeLists.txt
│ │ ├── config/
│ │ │ └── yacas/
│ │ │ └── yacas_version.h.in
│ │ ├── include/
│ │ │ └── yacas/
│ │ │ ├── GPL_stuff.h
│ │ │ ├── anumber.h
│ │ │ ├── anumber.inl
│ │ │ ├── arggetter.h
│ │ │ ├── arrayclass.h
│ │ │ ├── associationclass.h
│ │ │ ├── corefunctions.h
│ │ │ ├── deffile.h
│ │ │ ├── errors.h
│ │ │ ├── evalfunc.h
│ │ │ ├── genericobject.h
│ │ │ ├── infixparser.h
│ │ │ ├── lispatom.h
│ │ │ ├── lispenvironment.h
│ │ │ ├── lisperror.h
│ │ │ ├── lispeval.h
│ │ │ ├── lispevalhash.h
│ │ │ ├── lispglobals.h
│ │ │ ├── lisphash.h
│ │ │ ├── lispio.h
│ │ │ ├── lispobject.h
│ │ │ ├── lispoperator.h
│ │ │ ├── lispparser.h
│ │ │ ├── lispstring.h
│ │ │ ├── lispuserfunc.h
│ │ │ ├── mathcommands.h
│ │ │ ├── mathuserfunc.h
│ │ │ ├── mempool.h
│ │ │ ├── noncopyable.h
│ │ │ ├── numbers.h
│ │ │ ├── patcher.h
│ │ │ ├── patternclass.h
│ │ │ ├── patterns.h
│ │ │ ├── platfileio.h
│ │ │ ├── platmath.h
│ │ │ ├── refcount.h
│ │ │ ├── standard.h
│ │ │ ├── standard.inl
│ │ │ ├── string_utils.h
│ │ │ ├── stringio.h
│ │ │ ├── substitute.h
│ │ │ ├── tokenizer.h
│ │ │ ├── utf8/
│ │ │ │ ├── checked.h
│ │ │ │ ├── core.h
│ │ │ │ ├── cpp11.h
│ │ │ │ ├── cpp17.h
│ │ │ │ ├── cpp20.h
│ │ │ │ └── unchecked.h
│ │ │ ├── utf8.h
│ │ │ ├── xmltokenizer.h
│ │ │ └── yacas.h
│ │ └── src/
│ │ ├── anumber.cpp
│ │ ├── arggetter.cpp
│ │ ├── associationclass.cpp
│ │ ├── deffile.cpp
│ │ ├── errors.cpp
│ │ ├── infixparser.cpp
│ │ ├── lispatom.cpp
│ │ ├── lispenvironment.cpp
│ │ ├── lisperror.cpp
│ │ ├── lispeval.cpp
│ │ ├── lispevalhash.cpp
│ │ ├── lisphash.cpp
│ │ ├── lispio.cpp
│ │ ├── lispobject.cpp
│ │ ├── lispparser.cpp
│ │ ├── lispuserfunc.cpp
│ │ ├── mathcommands.cpp
│ │ ├── mathcommands2.cpp
│ │ ├── mathcommands3.cpp
│ │ ├── mathuserfunc.cpp
│ │ ├── mempool.cpp
│ │ ├── numbers.cpp
│ │ ├── patcher.cpp
│ │ ├── patternclass.cpp
│ │ ├── patterns.cpp
│ │ ├── platmath.cpp
│ │ ├── standard.cpp
│ │ ├── stdfileio.cpp
│ │ ├── stringio.cpp
│ │ ├── substitute.cpp
│ │ ├── tokenizer.cpp
│ │ ├── xmltokenizer.cpp
│ │ ├── yacasapi.cpp
│ │ └── yacasnumbers.cpp
│ ├── libyacas_mp/
│ │ ├── CMakeLists.txt
│ │ ├── benchmark/
│ │ │ ├── CMakeLists.txt
│ │ │ └── src/
│ │ │ └── nn_benchmark.cpp
│ │ ├── include/
│ │ │ └── yacas/
│ │ │ └── mp/
│ │ │ ├── limbs_vector.hpp
│ │ │ ├── nn.hpp
│ │ │ ├── rr.hpp
│ │ │ └── zz.hpp
│ │ ├── src/
│ │ │ ├── limbs_vector.cpp
│ │ │ ├── nn.cpp
│ │ │ ├── rr.cpp
│ │ │ └── zz.cpp
│ │ └── test/
│ │ ├── CMakeLists.txt
│ │ └── src/
│ │ ├── nn_test.cpp
│ │ └── zz_test.cpp
│ ├── packaging/
│ │ ├── deb/
│ │ │ ├── changelog
│ │ │ ├── compat
│ │ │ ├── control
│ │ │ ├── copyright
│ │ │ ├── missing-sources/
│ │ │ │ ├── jquery-ui.js
│ │ │ │ ├── jquery.autosize.js
│ │ │ │ ├── jquery.js
│ │ │ │ ├── jquery.ui-contextmenu.js
│ │ │ │ └── plotly-1.49.0.js
│ │ │ ├── rules
│ │ │ ├── source/
│ │ │ │ ├── format
│ │ │ │ └── include-binaries
│ │ │ └── yacas.1
│ │ ├── ebuild/
│ │ │ └── yacas.ebuild
│ │ ├── flatpak/
│ │ │ ├── org.yacas.yacas-gui.appdata.xml
│ │ │ ├── org.yacas.yacas-gui.json
│ │ │ └── org.yacas.yacas.json
│ │ ├── nsis/
│ │ │ ├── COPYING
│ │ │ └── yacas-win64.nsi
│ │ ├── pkg/
│ │ │ ├── distribution.xml
│ │ │ ├── license.txt
│ │ │ └── readme.html
│ │ ├── rpm/
│ │ │ └── yacas.spec
│ │ └── snap/
│ │ ├── snap/
│ │ │ └── gui/
│ │ │ └── yacas.gui.desktop
│ │ └── snapcraft.yaml
│ ├── xeus-yacas/
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ └── xeus-yacas/
│ │ │ └── xeus-yacas.hpp
│ │ └── src/
│ │ ├── interpreter.cpp
│ │ └── main.cpp
│ ├── yacas/
│ │ ├── CMakeLists.txt
│ │ ├── include/
│ │ │ ├── commandline.h
│ │ │ ├── core_yacasmain.h
│ │ │ ├── stdcommandline.h
│ │ │ ├── unixcommandline.h
│ │ │ └── win32commandline.h
│ │ ├── res/
│ │ │ └── yacas.rc
│ │ └── src/
│ │ ├── commandline.cpp
│ │ ├── js_interface.cpp
│ │ ├── stdcommandline.cpp
│ │ ├── unixcommandline.cpp
│ │ ├── win32commandline.cpp
│ │ └── yacasmain.cpp
│ ├── yacas-gui/
│ │ ├── CMakeLists.txt
│ │ ├── img.qrc
│ │ ├── include/
│ │ │ ├── cellproxy.h
│ │ │ ├── mainwindow.h
│ │ │ ├── preferences.h
│ │ │ ├── preferences_dialog.h
│ │ │ ├── yacasengine.h
│ │ │ ├── yacasrequest.h
│ │ │ └── yacasserver.h
│ │ ├── resources/
│ │ │ ├── CMakeLists.txt
│ │ │ ├── jquery/
│ │ │ │ ├── jquery.jeditable.autogrow.js
│ │ │ │ └── jquery.jeditable.js
│ │ │ ├── mathbar/
│ │ │ │ ├── functions.json
│ │ │ │ ├── functions_parser.js
│ │ │ │ ├── mathBar.js
│ │ │ │ └── mathbar.css
│ │ │ ├── webchannel/
│ │ │ │ └── qwebchannel.js
│ │ │ ├── yacas-online.html
│ │ │ ├── yacas_gui/
│ │ │ │ ├── attic/
│ │ │ │ │ └── intput.editable.js
│ │ │ │ ├── yacas_gui.css
│ │ │ │ └── yacas_gui.js
│ │ │ └── yacas_gui.html
│ │ ├── src/
│ │ │ ├── cellproxy.cpp
│ │ │ ├── main.cpp
│ │ │ ├── mainwindow.cpp
│ │ │ ├── preferences.cpp
│ │ │ ├── preferences_dialog.cpp
│ │ │ ├── yacasengine.cpp
│ │ │ ├── yacasrequest.cpp
│ │ │ └── yacasserver.cpp
│ │ ├── ui/
│ │ │ ├── mainwindow.ui
│ │ │ └── preferences_dialog.ui
│ │ ├── winres/
│ │ │ └── yacas_gui.rc
│ │ ├── yacas-gui.desktop
│ │ └── yacas.icns
│ └── yacas-kernel/
│ ├── CMakeLists.txt
│ ├── include/
│ │ ├── base64.hpp
│ │ ├── hmac_sha256.hpp
│ │ ├── yacas_engine.hpp
│ │ └── yacas_kernel.hpp
│ └── src/
│ ├── base64.cpp
│ ├── hmac_sha256.cpp
│ ├── main.cpp
│ ├── yacas_engine.cpp
│ └── yacas_kernel.cpp
├── docs/
│ ├── CMakeLists.txt
│ ├── Makefile
│ ├── book_of_algorithms/
│ │ ├── basic.rst
│ │ ├── index.rst
│ │ ├── integration.rst
│ │ ├── multivar.rst
│ │ ├── numtheory.rst
│ │ ├── references.bib
│ │ ├── references.rst
│ │ ├── sturm-sequences.rst
│ │ └── transforms.rst
│ ├── conf.py
│ ├── credits.rst
│ ├── getting_started/
│ │ └── index.rst
│ ├── glossary.rst
│ ├── index.rst
│ ├── license.rst
│ ├── make.bat
│ ├── programming_in_yacas/
│ │ └── index.rst
│ ├── reference_manual/
│ │ ├── arithmetic.rst
│ │ ├── calc.rst
│ │ ├── consts.rst
│ │ ├── controlflow.rst
│ │ ├── debugging.rst
│ │ ├── elementary.rst
│ │ ├── functional.rst
│ │ ├── graphs.rst
│ │ ├── index.rst
│ │ ├── io.rst
│ │ ├── linear-algebra.rst
│ │ ├── lists.rst
│ │ ├── logic.rst
│ │ ├── misc.rst
│ │ ├── number-theory.rst
│ │ ├── numerical-methods.rst
│ │ ├── ode.rst
│ │ ├── physics.rst
│ │ ├── plot.rst
│ │ ├── predicates.rst
│ │ ├── probability-and-statistics.rst
│ │ ├── programming.rst
│ │ ├── random.rst
│ │ ├── simplify.rst
│ │ ├── solvers.rst
│ │ ├── special.rst
│ │ ├── strings.rst
│ │ ├── univariate-polynomials.rst
│ │ └── vars.rst
│ ├── requirements.txt
│ ├── tutorial/
│ │ └── index.rst
│ └── util/
│ └── yacasdomain.py
├── jyacas/
│ ├── CMakeLists.txt
│ ├── CVersion.java.in
│ ├── JavaYacas.1
│ ├── MANIFEST.MF
│ ├── lib/
│ │ ├── hamcrest-core-1.3.jar
│ │ └── junit-4.11.jar
│ └── net/
│ └── sf/
│ └── yacas/
│ ├── ArrayClass.java
│ ├── AssociationClass.java
│ ├── BackQuoteBehaviour.java
│ ├── BasicEvaluator.java
│ ├── BigNumber.java
│ ├── BranchingUserFunction.java
│ ├── CYacas.java
│ ├── CachedStdFileInput.java
│ ├── EvalFuncBase.java
│ ├── GenericClass.java
│ ├── InfixParser.java
│ ├── InfixPrinter.java
│ ├── InputDirectories.java
│ ├── InputStatus.java
│ ├── JarInputFile.java
│ ├── LispArgList.java
│ ├── LispArityUserFunction.java
│ ├── LispAtom.java
│ ├── LispDefFile.java
│ ├── LispDefFiles.java
│ ├── LispEnvironment.java
│ ├── LispError.java
│ ├── LispEvaluatorBase.java
│ ├── LispGenericClass.java
│ ├── LispGlobalVariable.java
│ ├── LispHashTable.java
│ ├── LispInFixOperator.java
│ ├── LispInput.java
│ ├── LispIterator.java
│ ├── LispLocalFrame.java
│ ├── LispMultiUserFunction.java
│ ├── LispNumber.java
│ ├── LispObject.java
│ ├── LispOperators.java
│ ├── LispParser.java
│ ├── LispPrinter.java
│ ├── LispPtr.java
│ ├── LispPtrArray.java
│ ├── LispStandard.java
│ ├── LispSubList.java
│ ├── LispTokenizer.java
│ ├── LispUserFunction.java
│ ├── ListedBranchingUserFunction.java
│ ├── ListedMacroUserFunction.java
│ ├── LocalSymbolBehaviour.java
│ ├── MacroUserFunction.java
│ ├── MatchAtom.java
│ ├── MatchNumber.java
│ ├── MatchSubList.java
│ ├── MatchVariable.java
│ ├── MathCommands.java
│ ├── ParsedObject.java
│ ├── PatternClass.java
│ ├── StdFileInput.java
│ ├── StreamGobbler.java
│ ├── StringInput.java
│ ├── SubstBehaviour.java
│ ├── SubstBehaviourBase.java
│ ├── UserStackInformation.java
│ ├── XmlTokenizer.java
│ ├── YacasConsole.java
│ ├── YacasEvalCaller.java
│ ├── YacasEvaluator.java
│ ├── YacasException.java
│ ├── YacasInterpreter.java
│ ├── YacasParamMatcherBase.java
│ ├── YacasPatternPredicateBase.java
│ └── YacasTest.java
├── man/
│ ├── CMakeLists.txt
│ └── yacas.1.rst
├── papers/
│ ├── llncs.cls
│ ├── paper1.tex
│ └── paper2.tex
├── scripts/
│ ├── array.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── assoc.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── base.rep/
│ │ ├── math.ys
│ │ └── math.ys.def
│ ├── c_form.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── calendar.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── complex.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── constants.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── controlflow.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── cse.rep/
│ │ ├── cse.ys
│ │ └── cse.ys.def
│ ├── debug.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── deffunc.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── deriv.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── example.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── examples/
│ │ ├── ABIN.ys
│ │ ├── MinimumSpanningTree.ys
│ │ ├── benchbuild.ys
│ │ ├── benchmark.ys
│ │ ├── benchmark2.ys
│ │ ├── findsum.ys
│ │ ├── goldbach.ys
│ │ ├── pi.ys
│ │ ├── queens.ys
│ │ ├── series.ys
│ │ └── wordproblems.ys
│ ├── factors.rep/
│ │ ├── binaryfactors.ys
│ │ ├── binaryfactors.ys.def
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── functional.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── graph.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── html.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── integrate.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── io.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── defaultprint.ys
│ │ ├── defaultprint.ys.def
│ │ ├── errors.ys
│ │ ├── formula.ys
│ │ └── print.ys
│ ├── limit.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── linalg.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── lists.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── scopestack.ys
│ │ └── scopestack.ys.def
│ ├── localrules.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── logic.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── multivar.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── makemulti.ys
│ │ ├── sparsenomial.ys
│ │ ├── sparsetree.ys
│ │ └── sparsetree.ys.def
│ ├── newly.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── nintegrate.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── numbers.rep/
│ │ ├── GaussianIntegers.ys
│ │ ├── GaussianIntegers.ys.def
│ │ ├── NumberTheory.ys
│ │ ├── NumberTheory.ys.def
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── nthroot.ys
│ │ ├── nthroot.ys.def
│ │ └── om.ys
│ ├── odesolver.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── openmath.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── orthopoly.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── packages.ys
│ ├── padic.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── patterns.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── physics.rep/
│ │ └── quantum/
│ │ ├── clebsch-gordan.ys
│ │ └── clebsch-gordan.ys.def
│ ├── plots.rep/
│ │ ├── backends-2d.ys
│ │ ├── backends-3d.ys
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── plot2d.ys
│ │ ├── plot2d.ys.def
│ │ ├── plot3d.ys
│ │ └── plot3d.ys.def
│ ├── predicates.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── probability.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── products.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── pslq.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── r_form.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── rabinmiller.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── radsimp.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── random.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── rational.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── simplify.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── factorial.ys
│ │ └── factorial.ys.def
│ ├── solve.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── specfunc.rep/
│ │ ├── bernou.ys
│ │ ├── bernou.ys.def
│ │ ├── bessel.ys
│ │ ├── bessel.ys.def
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── gamma.ys
│ │ ├── gamma.ys.def
│ │ ├── gammaconst.ys
│ │ ├── gammaconst.ys.def
│ │ ├── om.ys
│ │ ├── zeta.ys
│ │ └── zeta.ys.def
│ ├── standard.ys
│ ├── standard.ys.def
│ ├── statistics.rep/
│ │ ├── distributions.ys
│ │ ├── distributions.ys.def
│ │ ├── hypothesystest.ys
│ │ ├── hypothesystest.ys.def
│ │ ├── incompletegamma.ys
│ │ ├── incompletegamma.ys.def
│ │ ├── randomtest.ys
│ │ ├── regression.ys
│ │ ├── regression.ys.def
│ │ ├── statistics.ys
│ │ └── statistics.ys.def
│ ├── stats.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── stdarith.ys
│ ├── stdarith.ys.def
│ ├── stdfuncs.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── elemfuncs.ys
│ │ ├── elemfuncs.ys.def
│ │ ├── numerical.ys
│ │ ├── numerical.ys.def
│ │ ├── nummethods.ys
│ │ ├── nummethods.ys.def
│ │ └── om.ys
│ ├── stdopers.ys
│ ├── stubs.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ └── om.ys
│ ├── substitute.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── sums.rep/
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── om.ys
│ │ ├── taylor.ys
│ │ ├── taylor.ys.def
│ │ ├── taylor3.ys
│ │ └── taylor3.ys.def
│ ├── tensor.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── testers.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── texform.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── transforms.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── trigsimp.rep/
│ │ ├── code.ys
│ │ └── code.ys.def
│ ├── univar.rep/
│ │ ├── Cyclotomic.ys
│ │ ├── Cyclotomic.ys.def
│ │ ├── code.ys
│ │ ├── code.ys.def
│ │ ├── sparse.ys
│ │ ├── sparse.ys.def
│ │ ├── sturm.ys
│ │ └── sturm.ys.def
│ └── yacasinit.ys
├── tests/
│ ├── CMakeLists.txt
│ ├── GaussianIntegers.yts
│ ├── arithmetic.yts
│ ├── association.yts
│ ├── binaryfactors.yts
│ ├── bitops.yts
│ ├── c_tex_form.yts
│ ├── calculus.yts
│ ├── calendar.yts
│ ├── canprove.yts
│ ├── comments.yts
│ ├── complex.yts
│ ├── cyclotomic.yts
│ ├── deriv.yts
│ ├── dimensions.yts
│ ├── dot.yts
│ ├── graphs.yts
│ ├── includetestfiles
│ ├── integrate.yts
│ ├── io.yts
│ ├── journal.yts
│ ├── linalg.yts
│ ├── lists.yts
│ ├── logic_simplify_test.yts
│ ├── macro.yts
│ ├── matrixpower.yts
│ ├── multivar.yts
│ ├── newly.yts
│ ├── nthroot.yts
│ ├── numbers.yts
│ ├── numerics.yts
│ ├── nummethods.yts
│ ├── ode.yts
│ ├── openmath.yts
│ ├── orthopoly.yts
│ ├── outer.yts
│ ├── padic.yts
│ ├── physics.yts
│ ├── plots.yts
│ ├── poly.yts
│ ├── predicates.yts
│ ├── products.yts
│ ├── programming.yts
│ ├── radsimp.yts
│ ├── rational.yts
│ ├── regress.yts
│ ├── scopestack.yts
│ ├── simplify.yts
│ ├── solve.yts
│ ├── sturm.yts
│ ├── sums.yts
│ ├── tensors.yts
│ ├── test-yacas
│ ├── test-yacas.bat
│ ├── tr.yts
│ ├── trace.yts
│ └── transforms.yts
├── third_party/
│ └── README.rst
├── utils/
│ └── pre-commit
└── yacas_UNINSTALL.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: false
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
- Regex: '.*'
Priority: 1
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: false
IndentPPDirectives: AfterHash
IndentWidth: 4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCBlockIndentWidth: 4
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
RawStringFormats:
- Delimiters: [pb]
Language: TextProto
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 8
UseTab: Never
...
================================================
FILE: .gitignore
================================================
/nbproject/
/build/
/install/
*.cmake
/CMakeFiles/
/CMakeScripts/
CMakeCache.txt
/Release/
/Debug/
/Yacas.build/
/Yacas.xcodeproj/
/JavaYacas/CVersion.java
/TEST-net.sf.yacas.YacasTest.xml
/yacas-logfile.txt
/jyacas/net/sf/yacas/CVersion.java
.DS_Store
.vscode/ipch/*
*.pyc
.vs/
out/
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch yacas",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/cyacas/yacas/yacas",
"args": ["--rootdir", "${workspaceRoot}/scripts/"],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "(gdb) Launch yacas arithmetic.yts",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/cyacas/yacas/yacas",
"args": ["--rootdir", "${workspaceRoot}/scripts/", "${workspaceRoot}/tests/arithmetic.yts"],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "(gdb) Launch yacas numerics.yts",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/cyacas/yacas/yacas",
"args": ["--rootdir", "${workspaceRoot}/scripts/", "${workspaceRoot}/tests/numerics.yts"],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "(gdb) Launch yacas orthopoly.yts",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/build/cyacas/yacas/yacas",
"args": ["--rootdir", "${workspaceRoot}/scripts/", "${workspaceRoot}/tests/orthoppoly.yts"],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
],
"compounds": []
}
================================================
FILE: .vscode/settings.json
================================================
{
"C_Cpp.intelliSenseEngine": "Default",
"editor.insertSpaces": true,
"editor.tabSize": 4,
"editor.detectIndentation": true,
"files.associations": {
"*.ltx": "latex",
"cctype": "cpp",
"cmath": "cpp",
"csignal": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"array": "cpp",
"atomic": "cpp",
"*.tcc": "cpp",
"chrono": "cpp",
"condition_variable": "cpp",
"cstdint": "cpp",
"exception": "cpp",
"functional": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iosfwd": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"ratio": "cpp",
"stdexcept": "cpp",
"system_error": "cpp",
"thread": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"typeinfo": "cpp",
"utility": "cpp",
"codecvt": "cpp",
"bitset": "cpp",
"clocale": "cpp",
"fstream": "cpp",
"iomanip": "cpp",
"iostream": "cpp",
"istream": "cpp",
"memory": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"streambuf": "cpp",
"algorithm": "cpp",
"*.ipp": "cpp",
"deque": "cpp",
"string": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"numeric": "cpp",
"optional": "cpp",
"string_view": "cpp",
"variant": "cpp"
},
"python.pythonPath": "/usr/bin/python3",
"files.exclude": {
"**/.DS_Store": true,
"**/.git": true,
"**/.hg": true,
"**/.svn": true,
"**/*.pyc": true,
"**/build": true,
"**/CVS": true
},
"files.trimTrailingWhitespace": true,
"restructuredtext.builtDocumentationPath": "${workspaceRoot}/build/docs/html",
"cmake.configureOnOpen": true,
"workbench.colorCustomizations": {
"statusBar.background": "#E49427",
"statusBar.debuggingBackground": "#E49427",
"statusBar.noFolderBackground": "#E49427",
"statussBar.prominentBackground": "#E49427"
},
"files.watcherExclude": {
"**/build/**": true
},
"cmake.installPrefix": "${workspaceRoot}/build/install/${buildKit}/${buildType}",
"cmake.configureSettings": {
"Qt5Core_DIR": "/usr/lib/x86_64-linux-gnu/cmake/Qt5Core",
"Qt5Widgets_DIR": "/usr/lib/x86_64-linux-gnu/cmake/Qt5Widgets",
"Qt5WebEngine_DIR": "/usr/lib/x86_64-linux-gnu/cmake/Qt5WebEngine",
"Qt5WebEngineWidgets_DIR": "/usr/lib/x86_64-linux-gnu/cmake/Qt5WebEngineWidgets",
"Qt5Svg_DIR": "/usr/lib/x86_64-linux-gnu/cmake/Qt5Svg"
},
"python.linting.pylintEnabled": true,
"python.linting.enabled": true,
"restructuredtext.confPath": ""
}
================================================
FILE: AUTHORS
================================================
************
Credits [*]_
************
Original/primary authors
========================
Ayal Pinkus *apinkus "AT" xs4all "DOT" nl*
This project was started by Ayal Pinkus who remains the main author and the primary maintainer.
Serge Winitzki *serge "AT" cosmos "DOT" phy "DOT" tufts "DOT" edu*
Added factorials over rationals, TeXForm, did a major overhaul of the introduction manual (actually, he wrote
large part of the manual as it is), and initiated numerous improvements and test code for Yacas, and
implemented yacas_client. Actually, Serge has been one of the larger contributors, and the main force behind
the improved documentation.
Jitse Niesen *jn221 "AT" damtp "DOT" cam "DOT" ac "DOT" uk*
Reported some bugs, helped improve various parts of Yacas, and greatly improved the manual for Yacas.
Maintainer
==========
Grzegorz Mazur *teoretyk "AT" gmail "DOT" com*
Contributors
============
Jim Apple *japple "AT" freeshell "DOT" org*
Reported bugs and supplied improved code for gcc 3.3.4
Mark Arrasmith *arrasmith "AT" math "DOT" twsu "DOT" edu*
Helped greatly in setting up the fltk-based graphicaluser interface, and fixed some bugs relating to limits
regarding infinity.
Fred Bacon *bacon "AT" aerodyne "DOT" com*
Fixed some compiler errors on the newer gcc compiles. Reported some important bugs.
Jay Belanger *belanger "AT" truman "DOT" edu*
Reported some bugs and improved some of the GnuPlot code. He also wrote the yacas.el file, which allows you
to run yacas from within emacs.
Roberto Colistete Junior
Is maintaining a version of `Yacas for SymbianOS `_.
Sebastian Ferraro *sferraro "AT" criba "DOT" edu "DOT" ar*
Reported bugs and supplied improved code (determinants).
John Fremlin
Added some code for fast calculation of roots of a cubic polynomial.
Peter Gilbert *peterdgilbert "AT" gmail "DOT" com*
Made many improvements to the C++ code to make it conform more to standard C++ coding conventions (class
interfaces looking more like stl), improved the regression test suite.
James Gilbertson *azurite "AT" telusplanet "DOT" net*
Win32 port, improved error reporting. Added initial version of Karatsuba multiplication, and added some matrix
functions to the math library.
Gabor Grothendieck
Gabor is the maintainer of `Ryacas `_, and gave valuable feedback on the
new web site.
Rene Grothmann *2004 "AT" rene-grothmann "DOT" de*
Married Euler to Yacas.
Franz Hack *franz.hack "AT" web "DOT" de*
Supplied a Delphi interface to the Yacas DLL.
Ingrid Halters
Helped improve the ease of use of the Yacas web site.
Mark Hatsell *mark "AT" autograph-maths "DOT" com*
Made the server code work on Windows.
Joris van der Hoeven *TeXmacs "AT" math "DOT" u-psud "DOT" fr*
Helped with texmacs support.
Wolfgang Hšnig *pocket_software "AT" web "DOT" de*
Created a port of Yacas that runs on PocketPC, to be found `here `_.
Daniel Richard G. *straker "AT" MIT "DOT" EDU*
Added autoconf/automake scripts, made Sun/Sgi compilation possible, created a rpm spec file, many many many
changes to clean up the source distribution.
Igor Khavkine
Added 'Diverge' and 'Curl', and implemented threading for the derivative operator (the gradient). Fixed GMP
code.
John Lapeyre
Made some modifications to the make file, and improved some math code.
Jonathan Leto *jonathan "AT" leto "DOT" net*
Helped improve the integration algorithm, and helped extend the tests used for Yacas (finding numerous bugs).
Vladimir Livshits *livshits "AT" cs "DOT" stanford "DOT" edu*
Set up the initial sourceforge CVS repository, and updated the Windows version source code. He also greatly
improved the logic theorem prover code.
Eugenia Loli
Helped build the BeOS version of Yacas.
Adolf Mathias *adolf_mathias "AT" web "DOT" de*
Grzegorz Mazur *teoretyk "AT" gmail "DOT" com*
Pablo De Nápoli *pdenapo "AT" yahoo "DOT" com*
Fixed the configure script so Yacas compiles under cygwin.
Gopal Narayanan *gopal "AT" debian "DOT" org*
Debian package maintainer. Made a man page for Yacas.
Marta Noga *marta.noga "AT" gmail "DOT" com*
Christian Obrecht *christian "DOT" obrecht "AT" wanadoo "DOT" fr*
Made a much better Limit, and made Yacas behave better at infinity.
Alberto González Palomo
Implemented a console-mode version of Yacas for AgendaVR. Changed the directory structure for the script
files, and implemented initial support for OpenMath.
Doreen Pinkus *d "DOT" pinkus "AT" hccnet "DOT" nl*
Designed the second version of the Web site for Yacas.
Mike Pinna *mike "AT" autograph-maths "DOT" com*
Applied some bug fixes.
Savario Prinz *yacas "AT" mac "DOT" com*
Built a fantastic Mac version of Yacas.
Dirk Reusch
Added some linear algebra functions, and fixed some predicate functions.
Daniel Rigby
Brought a client-server structure to the EPOC32 version of Yacas.
Juan Pablo Romero *jpablo_romero "AT" hotmail "DOT" com*
Reported many bugs, made many suggestions for improvements, and supplied improved code (yacas scripts and
makefile code).
Robert V Schipper *rvs "AT" achilles "DOT" nfia "DOT" org*
Ironed out a few bugs in Yacas.
Schneelocke
Reported an important bug in numeric calculations.
HenSiong Tan *tan "AT" stat "DOT" psu "DOT" edu*
Yannick Versley *yannick "AT" versley "DOT" de*
Sent some patches regarding bugs relating integration and differentiation.
Adrian V. *qwert2003 "AT" users "DOT" sourceforge "DOT" net*
Yijun Yu *y.yu "AT" open "DOT" ac "DOT" uk*
Implemented LDU decomposition
Ladislav Zejda
Supplied patches to make Yacas work on Dec Alpha's.
Andrei Zorine
Started the body of statistics code.
.. [*] All with last-known email addresses mangled in an obvious way
================================================
FILE: CMakeLists.txt
================================================
cmake_minimum_required (VERSION 3.10)
foreach (p CMP0048 CMP0054 CMP0071 CMP0135)
if (POLICY ${p})
cmake_policy(SET ${p} NEW)
endif ()
endforeach ()
option (ENABLE_CYACAS_CONSOLE "build the C++ yacas text console" ON)
option (ENABLE_CYACAS_GUI "build the C++ yacas GUI application" ON)
option (ENABLE_CYACAS_GUI_PRIVATE_CODEMIRROR "use private copy of CodeMirror in yacas GUI application" ON)
option (ENABLE_CYACAS_GUI_PRIVATE_MATHJAX "use private copy of MathJAX in yacas GUI application" ON)
option (ENABLE_CYACAS_KERNEL "build the C++ yacas Jupyter kernel" OFF)
option (ENABLE_CYACAS_XEUS "build the C++ yacas Xeus kernel" OFF)
option (ENABLE_CYACAS_UNIT_TESTS "build the C++ yacas engine unit tests" OFF)
option (ENABLE_CYACAS_BENCHMARKS "build the C++ yacas engine benchmarks" OFF)
option (ENABLE_JYACAS "build the Java yacas engine" OFF)
option (ENABLE_DOCS "generate documentation" OFF)
option (ENABLE_CODE_COVERAGE "enable coverage reporting" OFF)
if (ENABLE_CYACAS_CONSOLE OR ENABLE_CYACAS_GUI OR ENABLE_CYACAS_KERNEL)
set (ENABLE_CYACAS ON)
else ()
set (ENABLE_CYACAS OFF)
endif()
set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set (LANGUAGES CXX C)
if (ENABLE_JYACAS)
find_package (Java)
include (UseJava)
set (LANGUAGES ${LANGUAGES} Java)
endif ()
project (yacas VERSION 1.9.2 LANGUAGES ${LANGUAGES})
set (CMAKE_CXX_STANDARD 23)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CMAKE_CXX_EXTENSIONS OFF)
include (GNUInstallDirs)
include (CTest)
set (YACAS_SCRIPTS
scripts/array.rep/code.ys
scripts/array.rep/code.ys.def
scripts/assoc.rep/code.ys
scripts/assoc.rep/code.ys.def
scripts/base.rep/math.ys
scripts/base.rep/math.ys.def
scripts/c_form.rep/code.ys
scripts/c_form.rep/code.ys.def
scripts/calendar.rep/code.ys
scripts/calendar.rep/code.ys.def
scripts/complex.rep/code.ys
scripts/complex.rep/code.ys.def
scripts/complex.rep/om.ys
scripts/constants.rep/code.ys
scripts/constants.rep/code.ys.def
scripts/constants.rep/om.ys
scripts/controlflow.rep/code.ys
scripts/controlflow.rep/code.ys.def
scripts/cse.rep/cse.ys
scripts/cse.rep/cse.ys.def
scripts/debug.rep/code.ys
scripts/debug.rep/code.ys.def
scripts/deffunc.rep/code.ys
scripts/deffunc.rep/code.ys.def
scripts/deriv.rep/code.ys
scripts/deriv.rep/code.ys.def
scripts/example.rep/code.ys
scripts/example.rep/code.ys.def
scripts/factors.rep/binaryfactors.ys
scripts/factors.rep/binaryfactors.ys.def
scripts/factors.rep/code.ys
scripts/factors.rep/code.ys.def
scripts/functional.rep/code.ys
scripts/functional.rep/code.ys.def
scripts/functional.rep/om.ys
scripts/graph.rep/code.ys
scripts/graph.rep/code.ys.def
scripts/html.rep/code.ys
scripts/html.rep/code.ys.def
scripts/integrate.rep/code.ys
scripts/integrate.rep/code.ys.def
scripts/integrate.rep/om.ys
scripts/io.rep/code.ys
scripts/io.rep/code.ys.def
scripts/io.rep/defaultprint.ys
scripts/io.rep/defaultprint.ys.def
scripts/io.rep/errors.ys
scripts/io.rep/formula.ys
scripts/io.rep/print.ys
scripts/limit.rep/code.ys
scripts/limit.rep/code.ys.def
scripts/limit.rep/om.ys
scripts/linalg.rep/code.ys
scripts/linalg.rep/code.ys.def
scripts/lists.rep/code.ys
scripts/lists.rep/code.ys.def
scripts/lists.rep/scopestack.ys
scripts/lists.rep/scopestack.ys.def
scripts/localrules.rep/code.ys
scripts/localrules.rep/code.ys.def
scripts/logic.rep/code.ys
scripts/logic.rep/code.ys.def
scripts/logic.rep/om.ys
scripts/multivar.rep/code.ys
scripts/multivar.rep/code.ys.def
scripts/multivar.rep/makemulti.ys
scripts/multivar.rep/sparsenomial.ys
scripts/multivar.rep/sparsetree.ys
scripts/multivar.rep/sparsetree.ys.def
scripts/newly.rep/code.ys
scripts/newly.rep/code.ys.def
scripts/nintegrate.rep/code.ys
scripts/nintegrate.rep/code.ys.def
scripts/numbers.rep/GaussianIntegers.ys
scripts/numbers.rep/GaussianIntegers.ys.def
scripts/numbers.rep/NumberTheory.ys
scripts/numbers.rep/NumberTheory.ys.def
scripts/numbers.rep/code.ys
scripts/numbers.rep/code.ys.def
scripts/numbers.rep/nthroot.ys
scripts/numbers.rep/nthroot.ys.def
scripts/numbers.rep/om.ys
scripts/odesolver.rep/code.ys
scripts/odesolver.rep/code.ys.def
scripts/openmath.rep/code.ys
scripts/openmath.rep/code.ys.def
scripts/orthopoly.rep/code.ys
scripts/orthopoly.rep/code.ys.def
scripts/packages.ys
scripts/padic.rep/code.ys
scripts/padic.rep/code.ys.def
scripts/patterns.rep/code.ys
scripts/patterns.rep/code.ys.def
scripts/physics.rep/quantum/clebsch-gordan.ys
scripts/physics.rep/quantum/clebsch-gordan.ys.def
scripts/plots.rep/backends-2d.ys
scripts/plots.rep/backends-3d.ys
scripts/plots.rep/code.ys
scripts/plots.rep/code.ys.def
scripts/plots.rep/plot2d.ys
scripts/plots.rep/plot2d.ys.def
scripts/plots.rep/plot3d.ys
scripts/plots.rep/plot3d.ys.def
scripts/predicates.rep/code.ys
scripts/predicates.rep/code.ys.def
scripts/probability.rep/code.ys
scripts/probability.rep/code.ys.def
scripts/products.rep/code.ys
scripts/products.rep/code.ys.def
scripts/pslq.rep/code.ys
scripts/pslq.rep/code.ys.def
scripts/r_form.rep/code.ys
scripts/r_form.rep/code.ys.def
scripts/rabinmiller.rep/code.ys
scripts/rabinmiller.rep/code.ys.def
scripts/radsimp.rep/code.ys
scripts/radsimp.rep/code.ys.def
scripts/random.rep/code.ys
scripts/random.rep/code.ys.def
scripts/rational.rep/code.ys
scripts/rational.rep/code.ys.def
scripts/simplify.rep/code.ys
scripts/simplify.rep/code.ys.def
scripts/simplify.rep/factorial.ys
scripts/simplify.rep/factorial.ys.def
scripts/solve.rep/code.ys
scripts/solve.rep/code.ys.def
scripts/specfunc.rep/bernou.ys
scripts/specfunc.rep/bernou.ys.def
scripts/specfunc.rep/bessel.ys
scripts/specfunc.rep/bessel.ys.def
scripts/specfunc.rep/code.ys
scripts/specfunc.rep/code.ys.def
scripts/specfunc.rep/gamma.ys
scripts/specfunc.rep/gamma.ys.def
scripts/specfunc.rep/gammaconst.ys
scripts/specfunc.rep/gammaconst.ys.def
scripts/specfunc.rep/om.ys
scripts/specfunc.rep/zeta.ys
scripts/specfunc.rep/zeta.ys.def
scripts/standard.ys
scripts/standard.ys.def
scripts/statistics.rep/distributions.ys
scripts/statistics.rep/distributions.ys.def
scripts/statistics.rep/hypothesystest.ys
scripts/statistics.rep/hypothesystest.ys.def
scripts/statistics.rep/incompletegamma.ys
scripts/statistics.rep/incompletegamma.ys.def
scripts/statistics.rep/randomtest.ys
scripts/statistics.rep/regression.ys
scripts/statistics.rep/regression.ys.def
scripts/statistics.rep/statistics.ys
scripts/statistics.rep/statistics.ys.def
scripts/stats.rep/code.ys
scripts/stats.rep/code.ys.def
scripts/stdarith.ys
scripts/stdarith.ys.def
scripts/stdfuncs.rep/code.ys
scripts/stdfuncs.rep/code.ys.def
scripts/stdfuncs.rep/elemfuncs.ys
scripts/stdfuncs.rep/elemfuncs.ys.def
scripts/stdfuncs.rep/numerical.ys
scripts/stdfuncs.rep/numerical.ys.def
scripts/stdfuncs.rep/nummethods.ys
scripts/stdfuncs.rep/nummethods.ys.def
scripts/stdfuncs.rep/om.ys
scripts/stdopers.ys
scripts/stubs.rep/code.ys
scripts/stubs.rep/code.ys.def
scripts/stubs.rep/om.ys
scripts/substitute.rep/code.ys
scripts/substitute.rep/code.ys.def
scripts/sums.rep/code.ys
scripts/sums.rep/code.ys.def
scripts/sums.rep/om.ys
scripts/trigsimp.rep/code.ys.def
scripts/univar.rep/Cyclotomic.ys
scripts/univar.rep/Cyclotomic.ys.def
scripts/univar.rep/code.ys
scripts/trigsimp.rep/code.ys.def
scripts/univar.rep/Cyclotomic.ys
scripts/univar.rep/Cyclotomic.ys.def
scripts/univar.rep/code.ys
scripts/sums.rep/taylor.ys
scripts/sums.rep/taylor.ys.def
scripts/sums.rep/taylor3.ys
scripts/sums.rep/taylor3.ys.def
scripts/tensor.rep/code.ys
scripts/tensor.rep/code.ys.def
scripts/testers.rep/code.ys
scripts/testers.rep/code.ys.def
scripts/texform.rep/code.ys
scripts/texform.rep/code.ys.def
scripts/transforms.rep/code.ys
scripts/trigsimp.rep/code.ys.def
scripts/univar.rep/Cyclotomic.ys
scripts/univar.rep/Cyclotomic.ys.def
scripts/univar.rep/code.ys
scripts/transforms.rep/code.ys.def
scripts/trigsimp.rep/code.ys
scripts/trigsimp.rep/code.ys.def
scripts/univar.rep/Cyclotomic.ys
scripts/univar.rep/Cyclotomic.ys.def
scripts/univar.rep/code.ys
scripts/univar.rep/code.ys.def
scripts/univar.rep/sparse.ys
scripts/univar.rep/sparse.ys.def
scripts/univar.rep/sturm.ys
scripts/univar.rep/sturm.ys.def
scripts/yacasinit.ys)
if (ENABLE_CYACAS)
install (DIRECTORY scripts/ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/yacas/scripts COMPONENT app)
endif ()
if (ENABLE_DOCS)
add_subdirectory (docs)
add_subdirectory (man)
endif()
if (ENABLE_JYACAS)
add_subdirectory (jyacas)
endif ()
if (ENABLE_CYACAS)
add_subdirectory (cyacas)
endif ()
if (ENABLE_CYACAS OR ENABLE_JYACAS)
add_subdirectory (tests)
endif ()
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at teoretyk@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: COPYING
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "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
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY 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
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
Copyright (C)
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
================================================
FILE: ChangeLog
================================================
Changes are none, there is only the now.
================================================
FILE: README.rst
================================================
=====
yacas
=====
.. image:: https://img.shields.io/badge/license-LGPL--2.1%2B-blue.svg
:target: ./COPYING
.. image:: https://ci.appveyor.com/api/projects/status/r8gm1gdk61qe4rgd?svg=true
:target: https://ci.appveyor.com/project/grzegorzmazur/yacas
.. image:: http://readthedocs.org/projects/yacas/badge/?version=latest
:target: http://yacas.readthedocs.org/en/latest/?badge=latest
.. image:: https://api.codacy.com/project/badge/Grade/a66fdf5a0140492f9c6eee6c5ba18bd4
:target: https://www.codacy.com/manual/teoretyk/yacas?utm_source=github.com&utm_medium=referral&utm_content=grzegorzmazur/yacas&utm_campaign=Badge_Grade
.. image:: https://codecov.io/gh/grzegorzmazur/yacas/branch/master/graph/badge.svg
:target: https://codecov.io/gh/grzegorzmazur/yacas
Yacas (Yet Another Computer Algebra System) is a small and highly flexible
general-purpose Computer Algebra System (CAS). The syntax uses an
infix-operator grammar parser. The distribution contains a small library
of mathematical functions, but its real strength is in the language in which
you can easily write your own symbolic manipulation algorithms. The core engine
supports arbitrary precision arithmetic and is able to execute symbolic
manipulations on various mathematical objects by following user-defined rules.
For detailed information on yacas features and usage, see
``_.
=====
who is yacas for?
=====
This versatile Computer Algebra System (CAS) was developed to cater to a broad
audience, primarily consisting of mathematicians, engineers, and students. It
provides a user-friendly platform for performing symbolic mathematical computations,
solving intricate equations, all accessible via a command-line interface.
Furthermore, it serves as a free alternative to commercial CAS software.
For mathematics enthusiasts (probably less than 1% of the population),
this tool offers the capability to conduct advanced mathematical manipulations
and solve complex equations, making it valuable for research purposes and even
recreational mathematical exploration.
On the other hand, students can benefit from its educational potential,
using it as an open-source resource to learn and practice mathematics while
experiencing the advantages of an open-source product like Yacas.
=====
Getting Started
=====
Step by step guide to understand what yacas is about and start using it ``_
=====
Downloads
=====
Yacas is available for a variety of platforms. See
``_
for binary packages and installation instructions.
=====
Screenshots
=====
For a preview on how yacas looks like
``_
=====
Contact
=====
Report bugs or great enhancements ideas to our issue tracker ``_
We have a forum to talk math! ``_
FAQ ``_
Yacas is distributed under the GNU LESSER GENERAL PUBLIC LICENSE v2.1 or, at
your discretion, any later version.
================================================
FILE: TODO
================================================
TODO:
- Manual titles do not correspond with the manual you go to.
- Ceil, Round and Floor, also try to force to a number.
- From Laurent Debacker:
In file scripts/integrate.rep/code.ys, shouldn't the
IntFunc(x,(_x)^(-1),Ln(x));
be
IntFunc(x,(_x)^(-1),Ln(Abs(x)));
My motivation is based on http://metric.ma.ic.ac.uk/integration/techniques/indefinite/standard-integrals/integral-of-one-over-x/index.html .
- Remove the examples directory from the scripts directory, placing them somewhere else to reduce jar file size.
- Use reflection to look up methods, will make the jar file smaller.
- make the default read-eval-print loop print to out on the go, at least for the off-line version.
- do a cleanup of the "ref" manual, first pass to throw away functions that should not have been there in the first place.
- second chapter in refprog titled "Programming" has way too many functions
- chapter "List operators" has way too many function entries.
- chapter "Control flow" has entries relating only to the off-line version
- chapter "predicates" has way too many function entries.
- chapter "Input/output and plotting" has way too many function entries.
- chapter "Number theory" needs to be cleaned up.
- do a cleanup of the other books also
- scripts/examples/ do somewhere else?
- examples should have their own tests
- Test suite fails on Java version. We *have* to make the test suite more lenient.
- Remove Fast* (does not seem to be used anywhere). FastArcSin, FastAssoc, FastIsPrime, FastLog, FastPower do seem to be used.
- get rid of the Ortho?Sum functions, replace with just one?
- (find other ...Num functions)
- NewtonNum
- Future, change name of builtin functions that are not directly accessible to outside to have prefix Builtin'...
- Skim through Math... functions, renaming them to Builtin'...
- manuals, provide as zip files? more people can use unzip than can use untar.
- cos(arccos(x)) -> x+k*2*pi etc
- try if I can't change the format of numbers from 0.xxx to x.xxxx, is more natural
- make plain site not too wide also
- Move brackets slightly down in tex form pretty renderer, especially when what they bracket is not too big.
- step-by-step solver possible?
- screenshots, explanation of how to use, demo, tipbox, or *something*, to persuade people to enter something in the search field
- carefully change things so that the scripts do not have things like "N(Eval(" any more (just grep on it).
1) Documentation improvements
- examples embedded in the manual
- document ":test" to run test code from article
- link to mark-up documentation from the editors.
- what is Yacas? How did it come into existence? Why did I write it? Who is it for?
- mention the use of lists for passing multiple arguments.
============================================================================================================
- document the algorithms used, and expand on all of the functions currently implemented.
- separate manual chapter on tensors. (Serge? Is it going to change?). TSimplify and TExplicitSum, TD, X
- document the source code.
- document HoldArg in combination with <-- (or actually remove HoldArg? I want to depreciate UnFence/HoldArg in favor of macros)
- document II, ReII, ImII, IsComplexII
- document ExpressionDepth, PAdicExpandInternal, GetPrimeFactors, Rem, Roots, Apart, Together
- document UnHoldable, GcdReduce, ApplyPure, DestructiveAppendList, Pattern'Matches, Pattern'Create, RuleBaseDefined, Lambda (in combination with Apply), Primes, MapArgs, Substitute,
- document %, |, &, ^, if, else (else binds to the last if)
- document DivPoly, RootsWithMultiples,
- document OdeSolve
- document Dimensions, IsSquareMatrix, Tr.
- document Deriv, Berlekamp, ExtendedEuclidean, ExtendedEuclideanMonic
- document IsVariable
- document the fact that VarList can also be called with a second argument, a filter predicate.
- document Extended predicates in the pattern matcher (needs to be explained).
- document DefaultTokenizer()
- document XmlTokenizer, XmlExplodeTag
- document BSearch, FindIsq Search for a zero in a monotonously growing function. BSearch returns -1 if not found, FindIsq returns the insertion point.
- document MultiDivide, MultiGcd, Groebner
- document DefLoadFunction
- document CharString (input integer, output a string with one char, using the ascii code passed in).
- document FloatIsInt
- document Explain what is destructive about the Destructive... routines, why they are there, and when to use them.
- document Do slightly more on pure functions, to show why they are useful. Show for example Select.
- document Explain what Simplify currently does (internal algorithm).
- document The PcreLexer and PcreNextToken functions
- document Small summary of regular expressions syntax accepted.
- document Html... commands.
- document some blurb on the pattern matching/multivirtual functionality.
- Clean up integration code, and document algorithm used.
- document the extra Is... predicates for matrices that was added by Jonathan
- document threaded use of integration
2) Web site improvements
- allow saving multiple programs in cookies
- work through mommies feedback
- computer calculations made easy zou ik in lijn met het logo plaatsen liefst in lijn met de groene balletjes. Nu zweeft het een beetje los.
- Get Yacas en contact us is goed, maar ik zou het wat lager plaatsen in lijn met de tabs, maar wel zo laten als tekst links.
- Explain that a connection to the server is not needed, and that Yacas can be run off-line (with a link to a download of the Yacas web site).
============================================================================================================
- should I reconsider the way things are compressed? tgz? Why not zip?
- when leaving codeedit page, ask to remember code?
- think through wat it would look like if you could add content
- make all screens go 100% (edit, tutorial?) or at least center?
- create a clickable program snippet that is other than a one-liner (?)
- ideally programs should be uploaded to the datahub from the example
pages themselves, and not from recent.html, but for some reason that did
not work. When going from deeply-linked, trying it out does not work any
more and editing it also not.
- make descr/view/edit pages not reload, but refresh content dynamically
- In the tutorial, at "Solve", show how to verify that results are correct
3) Research
- Scan through my articles
- scan through examples already in examples directory in scripts dir
- take a look at Axiom code
- take a look at Maxima code
============================================================================================================
- Think through series of articles on tensors.
- Quaternions example?
- Example: the logarithmic derivative example from Fateman is nice.
- example: inverse, integrate taylor of 1/f'
- example: generating a polynomial solution for an ordinary DE
- For fun: try to understand Hensel lifting, and can it be made to apply
to say Feynman diagrams?
5) Math improvements
============================================================================================================
- allow control over formatting of floats.
- bumping up a version number seems to force a recompile of all the C++ files, config.h rewritten or so?
- make all the code more consistent, assuming that variables are real-valued.
- remove use of UnFence/HoldArg in favor of macros
- after use of UnFence/HoldArg has been removed, remove support for it
- local transforms: postpredicates do not seem to work any more.
- pattern matcher that can work on rings
- Change the system to use the II way of dealing with complex numbers in
favor of the Complex(r,i) construct.
- When the change to the II way of doing complex numbers is finished, add
it to the tutorial (if not already there), and change the manual
accordingly
- replace perl code in favor of C++ code, easier to maintain.
- sparserep from multi, use for uni too
- lists/arrays interchangable
- remove all uses of local files/directories.
- global var access, test code using a function to return a list of global
variables.
- Clean up Solve code, and document algorithm used.
- remove the final references to stdlib in the code.
- put Nl() in a common place (if it is still defined in different places
or an odd place).
- test Apart for polys. This might have to be adjusted by adding using the
same mechanism used for the integer version.
- Taylor on functions containing Abs/Sign can not be trusted (no idea what
I meant by that, but worth checking).
- Define the Local,.. functions based on their Macro counterparts, in the
scripts.
- also define a Head and Tail for arrays, and append/concat/
insert/delete/copy. This will ease swapping between lists and arrays.
- Allow for type convertors in pattern matchers. For instance: IsUniVar,
should be combined with CanBeUni and NormalForm to get the correct one
back.
- A RuleBaseDefined-like function that returns a list of defined arities.
- FindZeroes (polynoms and other functions)
- redivide some code ('newly')
- make suchthat more powerful, so it simplifies sin(x)=cos(x) to tan(x)=1
to x=Pi/4
- groebner bases
- see if using arrays for matrices speeds up things.
- Fix CanBeUni so that it deals correctly with 1/c
- EquateCoefs equate coefficients in two polys, and return as list.
- document /. and /:: with <-
- allow solve to return a list usable in /.
- matrix^negative is inverse^positive
6) Bugs:
============================================================================================================
- some limits not working correctly when using infinity: Limit(x,Infinity)
Zeta(x)
- factorize not checking for correctness of arguments:
Factorize(Infinity), Factorize(-1)
- Limit(x,0)D(x,2)Sin(x)/x never terminates (or rather takes a very long
time), which in turn causes Taylor(x,0,5)Sin(x)/x to never terminate.
- Limit(x,Infinity) x^n/Ln(x) returns n*Infinity, should be Infinity
- Limit(x,0,Right) x^( Ln(a)/(1+Ln(x)) ) returns 1, should be "a"
- [A:={{1,2,3,4},{0,1,2,3},{0,0,1,2},{I,0,I,I}}; EigenValues(A);] hangs
- L'Hopital's theorem is not always the correct thing to do. There
is a paper by Richardson, Salvy et al "Asymptotic expansions of exp-log
functions" that may be helpful.
- TrigSimpCombine(x^500)' exhausts the stack
- 'Solve(Exp(x^2)==Exp(x),x)' yields {} instead of {0,1}.
- BUG: InverseTaylor not working correctly for Sin and Tan???
- BUG: complex^float.
- Mod(a,b) generates some "UniVariate()" calls if a and b are undefined (I
expected it to return unevaluated). If one of them is defined, and the
other undefined, Mod() returns some numbers. Mod(x,-3) returns
unevaluated. I'm not sure what the "correct" meaning of Mod is for
negative moduli bases, but the answer should in any case be non-negative.
Mod(a,b) is defined as the smallest non-negative number c such that a-c is
divisible by b.
- Simplify(4-x-y) returns 4-y-x, Simplify(4-y-x) returns 4-x-y
- Functions to be implemented in the Java version still:
- LispFastMod
- YacasDllLoad
- LispPatchLoad
- LispPatchString
- Some more functions that are defined in yacasmain.cpp: Exit, IsExitRequested, HistorySize, StaSiz, IsPromptShown, ReadCmdLineString, FileSize
- LispDefaultTokenizer
- LispCommonLispTokenizer
- LispXmlTokenizer
- LispExplodeTag
- LispCustomEval
- LispCustomEvalExpression
- LispCustomEvalResult
- LispCustomEvalLocals
- LispCustomEvalStop
- LispTraceRule
- LispTraceStack
- command line flags for Java console version, useful for doing the test scripts
- Supporting the default read-eval-print loop from script in Java?
- Run the tests from Java
- Give some performance statistics on comparison between Java and C++
8) Unsorted:
============================================================================================================
- Search for defines I want to remove
- Document TeXFormMaxPrec()
- Document DefFileList()
- check that unnecessary scripts are not loaded unnecessarily (in debug mode?)
- Document FormulaMaxWidth()
- Document SetFormulaMaxWidth(width)
- Document the debugging facilities in the debug version, warnings on setting global variables etcetera.
- Global variables are still used in the wester test file
- Global variables are still used in the scripts that build the manuals
- Global variables are still used in the scripts that create the plugin stubs
- Global variables are still used in the scripts that compile/create for example libmath.cpp
- Is there not enough in common between the different files platfileio.h that we should perhaps consider merging them?
- For N, Verbose, etcetera, in stead of LocalSymbols guarding scope, perhaps a macro that generalizes the concept (with getters and setters, for a type of expandable singleton).
- have the application work in a directory structure that is identical to the source tree. --rootdir should be more general (set it and you can find the documentation also, etcetera).
- plotting functions are extremely verbose, this code needs to be reduced I feel
- other os-ish modules that I think are ugly, ShowPS ? Tries to write to /tmp/?
- examples direcory in scripts/, needed?
- allow sending openmath expressions and receiving them from a socket.
- allow parsing without having to require a ;
- removing ] from output
- Remove MacroSet/MacroClear and friends in favor of macros? makes the whole system simpler, and easier to compile.
- Erf does not work for numbers larger than one but not too large.
- http://www.causascientia.org/math_stat/Dists/Compendium.pdf
- remove TODOs in the source code
- document as of yet undocumented functions
- Try Yacas from some other applet, as a scripting language
- Try out MapReduce
- allow for a custom REP loop in server mode (would actually be trivial when sockets are defined in Yacas language)
- Mention MultiGcd in the documentation where polynomial operations are explained.
- make sure there are no collisions (axiom link in links.html for example) ???
- change all references to LISP in to YACAS, and Lisp in to Yacas
- univar.rep/Cyclotomic.ys is the only file to start with a capital (perhaps change to lower case?)
- some garbage (double defined functions) I'd like to remove from univar
- Taylor series expansion of Tan is slow, use other form for derivative?
- Solve: see if I can recreate HEQS?
- YacasInterpreter: also allow it to work from an applet?
- Write test for Solve({mean==(A/(A+B)),variance==((A*B)/(((A+B)^2) * (A+B+1)))},{A,B})
- There are warnings about YacasBase not having a virtual destructor, problem?
- document the behavior of underscores in Yacas.
- Clebsch-Gordan coefficients:
- Get Clebsch-Gordan code in to the main Yacas distribution.
- Test code for Clebsch-Gordan
- documentation for Clebsch-Gordan
- document *how* the random number generators work.
- -pc flags should also withhold the In> and Out> printing. Document that you need to use --read-eval-print ""
- http://centaur.maths.qmul.ac.uk/Computer_Algebra/MathAlgs/mathalgs.pdf
- restructure the documentation (there are a lot of unfinished parts written by Ayal).
- rewrite anumber, and document it this time.
- implement precision tracking the way Serge wants it, in the anumber version of BigNumber
- slowness of Taylor, due to its trivial implementation. Perhaps we should do something about this as soon as we have series calculus.
- Solve is way too simplistic.
- (Is this still true?) MatchAtom still compares atoms by string representation! It should raise an error if you define a pattern with a float in it.
============================================================================================================
9) Article fodder:
UI to search solution spaces
============================
Computers have made many laborious tasks easier to do. You can look up mathematical things in a database-ish way, or have the computer do repetitive work. There are more things computers are good at. Because you can design a user interface, you can design how it interacts with humans, you can effectively design a custom tool for a task.
When I did my internship (high-energy physics, Zeus, 1995-1996, at NIKHEF H) I used a user interface to get more results. The task at hand with high-energy physics is as follows; you have this massive accelerator that accelerates particles in a tube. The accelerated particle beams collide, and out of the collision come other particles. The particles that come out of it can tell you something about the structure of the particles that collided. Now at the point where the collision takes place people place what they call a detector. This detector detects particles coming from the collision. The collisions occur at enormous rates, so you get an enormous amount of data coming from these detectors. Any way, the data is filtered a bit (the amount of data coming from these detectors is so vast that one can not possibly hope to capture all of it, so electronics boards are designed to be able to handle the high bandwidth of data and filter out the events for which it is absolutely sure that the researchers will not be interested in it, reducing the amount of data captured), and then ends on a harddisk somewhere, in what they call (or used to call, don't know how it works nowadays) ntuples, essentially one big database table with rows of records, each record with some fields. Each row is an isolated event that might be of interest. Now the trick is to make a selection of the events, and plot a certain number. For example, one could take all the events where the electron (one of the incoming particles) scattered heavily backwards, and then plot the mass of the whole system, as in a histogram, where you accumulate the results of events with mass between two values in one bin, mass between other values in the next bin, etcetera. You would then see a sea of noise, with hopefully a peak in it, which would be called a "resonance", and would indicate that there had been a short-lived particle with that mass. The narrower the peak, the longer-lived the particles. The wider the peak, the shorter-lived the particles. This way you could measure the speed at which they decayed, which you can also calculate from theory sometimes, or at least use as an input parameter for theory. And you could measure the precise point of the top, so as to give you the mass of the particle. And you could count the number of events that were in the peak, and again compare that to theory, which should be able to give a prediction of the amount of events that were observed given the intensity of the beams colliding against each other. The trick would be to find the area where the resonance (the peak) should be, and try to design filters that reduce the background noise while keeping as much as possible of the signal. The filters would be simple things (often referred to as cuts, as they cut out a part of the data). For example, you could select all the events for which a specific value in one of the fields of the ntuple was larger than a certain value. Or smaller than a specific value. Large part of the work consisted of just trial-and-error, finding the good cuts to apply as to get the best view on the resonance. The cut to apply was the real information being sought. It required hard work, putting in many many many hours. The more hours you worked, the more likely you were to find something interesting. Being smart is not enough in such a case, as luck plays a big role (as they say, luck is when opportunity meets preparation). After you found the best cuts to apply to the data, it was surprisingly little information you needed to communicate. It could be as little as just a few conditionals, selecting all the events with, say, a detected electron, and where the virtual photon had a larger energy than such and so, and ... Surprisingly hard work for so little information. One would then proceed to get an estimate of the curve representing the noise, and subtract that from the data, to arrive at the pure signal.
A good estimate of the total noise is then subtracted from the total data in what is hoped to then be the resulting signal of the resonance being sought. The task is thus essentially just to count how often something happened, and to try to make a wise selection of the events to look at.
One problem I encountered during my internship was that due to the fact that there was just such a vast amount of data, each time I wanted to change a cut, you had to wait forever (10 minutes sometimes), for the result. You would wander off and do something else, and come back to the window where you were trying the cut, wondering what it was again you were trying out. It all just moved very slow.
So one weekend I resolved to make a nice little tool to make my life easier. The entire group worked on a Silicon Graphics workstation at that time, which apparently had cost the equivalent of 150,000.00 euros, and carried an astonishing 256 megabytes of RAM. Twelve people worked on that. Chances are you are now reading this article on a computer that cost a fraction of that machine, and has many times more memory than we had back then. And we were doing cutting edge research! But I digress.
I used what knowledge I had already gleaned from the data to make a stricter selection on the data. What resulted was something like 38 megabytes of data remaining. What I then did was load that all in to memory (I waited until every one had gone home so I had the full system to myself, one advantage of working on big iron). In addition, I kept an index of each field, and sorted the records per that field, in that index. Now, I created a little user interface that would show a graph, histogram, of the counts of number of events per bin. And I defined scrollbars that allowed me to define ranges from within to select data. Those were effectively two cuts, one to the left and one to the right, limiting the amount to fall within a range of two values, a
- One-off tasks, completable in a few hours
- A look at Google Analytics
- Example: RootsOfUnity (nice example of threading): Exp(2*Pi*I*(1 .. n)/n)
- Example: Average (nice example of threading): Average(list_IsList) <-- Add(list)/Length(list);
- Example: Fibonacci series, Lucas series.
- Verify( Fibonacci(242), 168083057059453008835412295811648513482449585399521 );
- Verify( Fibonacci(6,.5), 2.03125 );
- Verify( Fibonacci(3,.5), 1.25 );
- Article: rant on strong typing versus test code
- Article on splitting documentation between the two target audiences "user" and "maintainer".
- poking fun at systems by caricaturizing their properties
================================================
FILE: appveyor.yml
================================================
branches:
only:
- master
- develop
skip_tags: true
platform:
- x64
configuration:
- Release
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
CMAKE_GENERATOR: "Visual Studio 16 2019"
ENABLE_CYACAS_GUI: On
ENABLE_CYACAS_KERNEL: On
QTDIR: C:\Qt\5.15.2\msvc2019_64
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
CMAKE_GENERATOR: "Visual Studio 17 2022"
ENABLE_CYACAS_GUI: Off
ENABLE_CYACAS_KERNEL: On
QTDIR: C:\Qt\5.15.2\msvc2022_64
- APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu2004
CMAKE_GENERATOR: "Ninja"
ENABLE_CYACAS_GUI: Off
ENABLE_CYACAS_KERNEL: On
QTDIR: $HOME/Qt/5.15.2/gcc_64/bin
- APPVEYOR_BUILD_WORKER_IMAGE: macos-bigsur
CMAKE_GENERATOR: "Xcode"
ENABLE_CYACAS_GUI: Off
ENABLE_CYACAS_KERNEL: Off
QTDIR: $HOME/Qt/5.15.2/clang_64/bin
install:
- cmd: if not exist C:\Tools\vcpkg\installed\x64-windows\bin (
cd c:\tools\vcpkg &
vcpkg install boost-filesystem:x64-windows &
vcpkg install boost-date-time:x64-windows &
vcpkg install boost-serialization:x64-windows &
vcpkg install boost-uuid:x64-windows &
vcpkg install boost-dll:x64-windows &
vcpkg install openssl:x64-windows &
vcpkg install zeromq:x64-windows &
vcpkg install jsoncpp:x64-windows &
vcpkg install cppzmq:x64-windows &
vcpkg integrate install
)
- sh: if [ "$APPVEYOR_BUILD_WORKER_IMAGE" == "Ubuntu2004" ]; then
sudo apt-get update -qq;
sudo apt-get install -qq libboost-all-dev libssl-dev libjsoncpp-dev libzmq3-dev;
fi
- sh: if [ "$APPVEYOR_BUILD_WORKER_IMAGE" == "macos-bigsur" ]; then
brew update;
brew upgrade;
brew install boost jsoncpp zeromq;
fi
cache:
- c:\tools\vcpkg\installed\ -> appveyor.yml
before_build:
- cmd: cd %APPVEYOR_BUILD_FOLDER%
- cmd: cmake -H. -Bbuild -G "%CMAKE_GENERATOR%" -DCMAKE_TOOLCHAIN_FILE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DENABLE_CYACAS_KERNEL=%ENABLE_CYACAS_KERNEL% -DENABLE_CYACAS_UNIT_TESTS=Off -DENABLE_CYACAS_BENCHMARKS=Off -DENABLE_CYACAS_GUI=%ENABLE_CYACAS_GUI% -DCMAKE_PREFIX_PATH="%QTDIR%" -DCMAKE_INSTALL_PREFIX=%APPVEYOR_BUILD_FOLDER%\install
- sh: cd $APPVEYOR_BUILD_FOLDER
- sh: cmake -H. -Bbuild -G $CMAKE_GENERATOR -DCMAKE_BUILD_TYPE=Release -DENABLE_CYACAS_KERNEL=$ENABLE_CYACAS_KERNEL -DENABLE_CYACAS_UNIT_TESTS=Off -DENABLE_CYACAS_BENCHMARKS=Off -DENABLE_CYACAS_GUI=$ENABLE_CYACAS_GUI -DCMAKE_PREFIX_PATH="$QTDIR" -DCMAKE_INSTALL_PREFIX=$APPVEYOR_BUILD_FOLDER/install
build_script:
- cmd: cd %APPVEYOR_BUILD_FOLDER%\build
- cmd: cmake --build . --config Release --target install
- sh: cd $APPVEYOR_BUILD_FOLDER/build
- sh: cmake --build . --config Release --target install
test_script:
- cmd: cd %APPVEYOR_BUILD_FOLDER%\build
- cmd: ctest -C Release
- sh: cd $APPVEYOR_BUILD_FOLDER/build
- sh: ctest -C Release
after_build:
- cmd: cd ..\install
- cmd: 7z a yacas.zip *
- sh: cd ../install
- sh: zip -r yacas.zip *
artifacts:
- path: install/yacas.zip
name: yacas
================================================
FILE: build.xml
================================================
jyacas build file
================================================
FILE: cyacas/CMakeLists.txt
================================================
if (APPLE)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_INSTALL_FRAMEWORK_PREFIX "/Library/Frameworks" CACHE STRING "Directory to install frameworks to.")
set(CMAKE_INSTALL_BUNDLE_PREFIX "/Applications" CACHE STRING "Directory to install application bundles to.")
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang OR CMAKE_CXX_COMPILER_ID STREQUAL AppleClang)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -fPIC")
elseif (MSVC)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800")
add_definitions(-DYACAS_NO_CONSTEXPR -DYACAS_NO_ATOMIC_TYPES -DYACAS_UINT32_T_IN_GLOBAL_NAMESPACE)
endif ()
if (CMAKE_SYSTEM_NAME STREQUAL Emscripten)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s DISABLE_EXCEPTION_CATCHING=0 -s ASSERTIONS=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=['cwrap'] -s ALLOW_MEMORY_GROWTH=1")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --embed-file ${PROJECT_SOURCE_DIR}/scripts@/share/yacas/scripts")
endif ()
include(CheckIPOSupported)
check_ipo_supported(RESULT IPO_SUPPORTED)
add_library(coverage_config INTERFACE)
if (ENABLE_CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
# Add required flags (GCC & LLVM/Clang)
target_compile_options(coverage_config INTERFACE
-g # generate debug info
--coverage # sets all required flags
)
if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
target_link_options(coverage_config INTERFACE --coverage)
else ()
target_link_libraries(coverage_config INTERFACE --coverage)
endif ()
endif ()
add_subdirectory (libyacas_mp)
add_subdirectory (libyacas)
if (ENABLE_CYACAS_CONSOLE)
add_subdirectory (yacas)
endif ()
if (ENABLE_CYACAS_GUI)
add_subdirectory (yacas-gui)
endif ()
if (ENABLE_CYACAS_KERNEL)
add_subdirectory (yacas-kernel)
endif ()
if (ENABLE_CYACAS_XEUS)
add_subdirectory (xeus-yacas)
endif ()
================================================
FILE: cyacas/libyacas/CMakeLists.txt
================================================
configure_file (
"config/yacas/yacas_version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/config/yacas/yacas_version.h"
)
set (SOURCES
src/associationclass.cpp
src/deffile.cpp
src/infixparser.cpp
src/lispatom.cpp
src/lispenvironment.cpp
src/lispeval.cpp
src/lisperror.cpp
src/lispio.cpp
src/lispobject.cpp
src/lispparser.cpp
src/lispuserfunc.cpp
src/mathcommands.cpp
src/mathuserfunc.cpp
src/standard.cpp
src/stdfileio.cpp
src/arggetter.cpp
src/stringio.cpp
src/tokenizer.cpp
src/yacasapi.cpp
src/lispevalhash.cpp
src/patterns.cpp
src/patternclass.cpp
src/substitute.cpp
src/mathcommands2.cpp
src/mathcommands3.cpp
src/mempool.cpp
src/errors.cpp
src/patcher.cpp
src/xmltokenizer.cpp
src/anumber.cpp
src/yacasnumbers.cpp
src/numbers.cpp
src/platmath.cpp
src/lisphash.cpp)
set (HEADERS
include/yacas/anumber.h
include/yacas/anumber.inl
include/yacas/arggetter.h
include/yacas/arrayclass.h
include/yacas/associationclass.h
include/yacas/corefunctions.h
include/yacas/deffile.h
include/yacas/errors.h
include/yacas/evalfunc.h
include/yacas/genericobject.h
include/yacas/GPL_stuff.h
include/yacas/infixparser.h
include/yacas/lispatom.h
include/yacas/lispenvironment.h
include/yacas/lisperror.h
include/yacas/lispeval.h
include/yacas/lispevalhash.h
include/yacas/lispglobals.h
include/yacas/lisphash.h
include/yacas/lispio.h
include/yacas/lispobject.h
include/yacas/lispoperator.h
include/yacas/lispparser.h
include/yacas/lispstring.h
include/yacas/lispuserfunc.h
include/yacas/mathcommands.h
include/yacas/mathuserfunc.h
include/yacas/mempool.h
include/yacas/noncopyable.h
include/yacas/numbers.h
include/yacas/patcher.h
include/yacas/patternclass.h
include/yacas/patterns.h
include/yacas/platfileio.h
include/yacas/platmath.h
include/yacas/refcount.h
include/yacas/standard.h
include/yacas/standard.inl
include/yacas/stringio.h
include/yacas/string_utils.h
include/yacas/substitute.h
include/yacas/tokenizer.h
include/yacas/utf8/core.h
include/yacas/utf8/checked.h
include/yacas/utf8/unchecked.h
include/yacas/utf8.h
include/yacas/xmltokenizer.h
include/yacas/yacas.h)
add_library (libyacas ${SOURCES} ${HEADERS})
set_target_properties (libyacas PROPERTIES OUTPUT_NAME "yacas" INTERPROCEDURAL_OPTIMIZATION ${IPO_SUPPORTED})
target_include_directories (libyacas PUBLIC include "${CMAKE_CURRENT_BINARY_DIR}/config")
target_link_libraries (libyacas PUBLIC libyacas_mp coverage_config)
install (TARGETS libyacas LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT app)
install (DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT dev)
install (FILES "${CMAKE_CURRENT_BINARY_DIR}/config/yacas/yacas_version.h" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/yacas COMPONENT dev)
# if (APPLE)
# add_library (libyacas_framework SHARED ${SOURCES} ${HEADERS})
# set_target_properties(libyacas_framework PROPERTIES OUTPUT_NAME "yacas" VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION} FRAMEWORK ON)
# target_link_libraries(libyacas_framework libyacas_mp)
# target_include_directories (libyacas_framework PUBLIC include "${CMAKE_CURRENT_BINARY_DIR}/config")
# add_custom_command(TARGET libyacas_framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/scripts $/Resources/scripts)
# add_custom_command(TARGET libyacas_framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include $/Headers)
# add_custom_command(TARGET libyacas_framework POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/config $/Headers)
# add_custom_command(TARGET libyacas_framework POST_BUILD COMMAND cd "$/../.." && rm -f Headers && ln -s Versions/Current/Headers Headers)
# install (TARGETS libyacas_framework FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX} COMPONENT framework)
# endif()
================================================
FILE: cyacas/libyacas/config/yacas/yacas_version.h.in
================================================
#ifndef YACAS_VERSION
#define YACAS_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define YACAS_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define YACAS_VERSION_MICRO @PROJECT_VERSION_PATCH@
#define YACAS_VERSION "@PROJECT_VERSION@"
#endif
================================================
FILE: cyacas/libyacas/include/yacas/GPL_stuff.h
================================================
#ifndef YACAS_GPL_STUFF_H
#define YACAS_GPL_STUFF_H
#define GPL_base_text \
"Yacas is Free Software--Free as in Freedom--so you can redistribute Yacas or\n" \
"modify it under certain conditions. Yacas comes with ABSOLUTELY NO WARRANTY.\n" \
"See the GNU Lesser General Public License (LGPL) version 2.1 or (at your\n" \
"discretion) any later version for the full conditions.\n"
#define Yacas_Web_info \
"See http://www.yacas.org/ for more information on yacas. and documentation.\n"\
"Type ?? for help. Or type ?function for help on a function.\n"
#define Yacas_help_info \
"Type ?license or ?licence to see the LGPL version 2.1;\n"
// This is the full text for systems where the online help (?blah) is available
#define GPL_blurb GPL_base_text Yacas_help_info Yacas_Web_info "\n"
// This is for systems where online help (?blah) is normally not available
#define GPL_blurb_nohelp GPL_base_text Yacas_Web_info "\n"
#endif
================================================
FILE: cyacas/libyacas/include/yacas/anumber.h
================================================
#ifndef YACAS_ANUMBER_H
#define YACAS_ANUMBER_H
#include
#include
#include
#include
#include "yacas/mp/zz.hpp"
// These define the internal types for the arbitrary precision
// number module. The larger they are the better. PlatDoubleWord
// should be at least twice as big as PlatWord, to prevent overflowing
// during multiplication.
typedef std::uint32_t PlatWord;
typedef std::uint64_t PlatDoubleWord;
typedef std::int64_t PlatSignedDoubleWord;
/* Quantities derived from the platform-dependent types for doing
* arithmetic.
*/
#define WordBits (8*sizeof(PlatWord))
#define WordBase (((PlatDoubleWord)1)<
{
public:
ANumber(const std::string& aString,int aPrecision,int aBase=10);
ANumber(const yacas::mp::ZZ&, int aPrecision);
explicit ANumber(int aPrecision);
//TODO the properties of this object are set in the member initialization list, but then immediately overwritten by the CopyFrom. We can make this slightly cleaner by only initializing once.
inline ANumber(const ANumber& aOther) : std::vector(), iExp(0),iNegative(false),iPrecision(0),iTensExp(0)
{
CopyFrom(aOther);
}
void CopyFrom(const ANumber& aOther);
bool ExactlyEqual(const ANumber& aOther);
void SetTo(const std::string& aString,int aBase=10);
int Precision() const;
void SetPrecision(int aPrecision) {iPrecision = aPrecision;}
void ChangePrecision(int aPrecision);
void RoundBits();
void DropTrailZeroes();
void Expand();
void Negate();
bool IsZero() const;
bool IsNegative() const;
bool IsEven() const;
void Print(std::ostream&, const std::string& prefix) const;
public:
int iExp;
bool iNegative;
int iPrecision;
int iTensExp;
};
inline
int ANumber::Precision() const
{
return iPrecision;
}
bool BaseLessThan(const ANumber& a1, const ANumber& a2);
bool BaseGreaterThan(const ANumber& a1, const ANumber& a2);
void BaseDivide(ANumber& aQuotient, ANumber& aRemainder, ANumber& a1, ANumber& a2);
void IntegerDivide(ANumber& aQuotient, ANumber& aRemainder, ANumber& a1, ANumber& a2);
bool Significant(ANumber& a);
int WordDigits(int aPrecision, int aBase);
// Operations on ANumber.
void Negate(ANumber& aNumber);
void ANumberToString(std::string& aResult, ANumber& aNumber, int aBase, bool aForceFloat=false);
void Add(ANumber& aResult, ANumber& a1, ANumber& a2);
void Subtract(ANumber& aResult, ANumber& a1, ANumber& a2);
void Multiply(ANumber& aResult, ANumber& a1, ANumber& a2);
void Divide(ANumber& aQuotient, ANumber& aRemainder, ANumber& a1, ANumber& a2);
bool GreaterThan(ANumber& a1, ANumber& a2);
bool LessThan(ANumber& a1, ANumber& a2);
void BaseShiftRight(ANumber& a, int aNrBits);
void BaseShiftLeft(ANumber& a, int aNrBits);
void NormalizeFloat(ANumber& a2, int digitsNeeded);
inline
void ANumber::Negate()
{
iNegative = !iNegative;
// FIXME: do we need negative zero?
if (IsZero())
iNegative = false;
}
inline
bool ANumber::IsZero() const
{
return std::all_of(begin(), end(), [](PlatWord a) {return a == 0;});
}
inline
bool ANumber::IsNegative() const
{
return iNegative;
}
inline
bool ANumber::IsEven() const
{
return (front() & 1) == 0;
}
#include "anumber.inl"
#endif
================================================
FILE: cyacas/libyacas/include/yacas/anumber.inl
================================================
#include "anumber.h"
/* BaseTimesInt : multiply a with one digit in the range 0..(aBase-1)
*/
template
inline void BaseTimesInt(T& a,PlatDoubleWord aNumber, PlatDoubleWord aBase)
{
PlatDoubleWord carry=0;
const int nr=a.size();
typename T::value_type * aptr = &a[0];
for (int i=0;i
inline void WordBaseTimesInt(T& a,PlatDoubleWord aNumber)
{
PlatDoubleWord carry=0;
const int nr=a.size();
typename T::value_type * aptr = &a[0];
for (int i=0;i> WordBits;
}
if (carry)
a.push_back(carry);
}
template
inline void BaseDivideInt(T& a,PlatDoubleWord aNumber, PlatDoubleWord aBase, PlatDoubleWord& aCarry)
{
const int nr=a.size();
PlatDoubleWord carry=0;
typename T::value_type * aptr = &a[0];
for (int i=nr-1;i>=0;i--) {
const PlatDoubleWord word = (carry*aBase)+((PlatDoubleWord)(aptr[i]));
aptr[i] = word / aNumber;
carry= word % aNumber;
}
//carry now is the remainder
aCarry = carry;
}
/* GrowDigits : add digits to a until it has aDigits digits
*/
template
inline void GrowDigits(T& a, std::size_t aDigits)
{
if (aDigits <= a.size())
return;
a.resize(aDigits, 0);
}
/* BaseAdd : destructively add aSource to aTarget, in base aBase.
*/
template
inline void BaseAdd(T& aTarget, const T& aSource, PlatDoubleWord aBase)
{
// Initialize result
GrowDigits(aTarget,aSource.size());
aTarget.push_back(0);
int nr = std::min(aTarget.size(), aSource.size());
PlatDoubleWord carry=0;
const typename T::value_type * sourcePtr = &aSource[0];
typename T::value_type * targetPtr = &aTarget[0];
for (int digit=0;digit
inline void WordBaseAdd(T& aTarget, const T& aSource)
{
// Initialize result
GrowDigits(aTarget,aSource.size());
aTarget.push_back(0);
int nr = std::min(aTarget.size(), aSource.size());
PlatDoubleWord carry=0;
const typename T::value_type * sourcePtr = &aSource[0];
typename T::value_type * targetPtr = &aTarget[0];
for (int digit=0;digit> WordBits);
targetPtr[digit] = (typename T::value_type)newDigit;
carry = newCarry;
}
while (carry != 0)
{
PlatSignedDoubleWord ww = targetPtr[nr];
ww+=carry;
targetPtr[nr] = (typename T::value_type)ww; // PDG - cast to avoid compile-time warning
carry = ww >> WordBits;
nr++;
}
}
template
inline void BaseSubtract(T& aResult, T& a2, int offset)
{
if (a2.IsZero())
return;
// Initialize result
int nr = a2.size();
typename T::value_type * resultPtr = &aResult[0];
typename T::value_type * a2ptr = &a2[0];
while (a2ptr[nr-1] == 0)
nr--;
// Subtract on a per-digit basis
PlatSignedDoubleWord carry=0;
int digit;
for (digit=0;digit 0.
// Assume aNumber is an integer > 0.
// Assume PlatDoubleWord is an integer type.
// Will maximum digit (i.e., aBase-1) convert to T::value_type right?
//LISPASSERT( (typename T::value_type)(aBase) == (aBase) ); // use aBase instead, to help CTCE
aTarget.clear();
while (aNumber != 0)
{
aTarget.push_back(aNumber%aBase);
aNumber/=aBase;
}
if (aTarget.empty())
aTarget.push_back(0);
}
// BaseAddMultiply : multiply x and y, and add result to aTarget
//
inline
void BaseAddMultiply(std::string& aTarget, const std::string& x, const std::string& y, PlatDoubleWord aBase) {
const unsigned nrx = static_cast(x.size());
const unsigned nry = static_cast(y.size());
GrowDigits(aTarget, nrx + nry + 1);
std::string::value_type *targetPtr = &aTarget[0];
const std::string::value_type *xPtr = &x[0];
const std::string::value_type *yPtr = &y[0];
for (unsigned ix = 0; ix < nrx; ix++) {
PlatDoubleWord carry = 0;
for (unsigned iy = 0; iy < nry; iy++) {
const PlatDoubleWord word =
static_cast (targetPtr[ix + iy]) +
static_cast (xPtr[ix]) *
static_cast (yPtr[iy]) + carry;
targetPtr[ix + iy] = word % aBase;
carry = word / aBase;
}
targetPtr[ix + nry] += carry;
}
}
template
inline void WordBaseAddMultiply(T& aTarget, const T& x, const T& y)
{
const unsigned nrx=x.size();
const unsigned nry=y.size();
GrowDigits(aTarget,nrx+nry+1);
typename T::value_type *targetPtr = &aTarget[0];
const typename T::value_type *xPtr = &x[0];
const typename T::value_type *yPtr = &y[0];
for (unsigned ix=0;ix(targetPtr[ix+iy])+
static_cast(xPtr[ix])*
static_cast(yPtr[iy])+carry;
targetPtr[ix+iy] = word;
carry = word >> WordBits;
}
const PlatDoubleWord word =
static_cast(targetPtr[ix+nry])+carry;
targetPtr[ix+nry] = word;
assert((word >> WordBits) == 0);
}
}
/* BaseMultiply : multiply x and y, and put result in aTarget
*/
template
inline void BaseMultiply(T& aTarget, const T& x, const T& y, PlatDoubleWord aBase)
{
aTarget.resize(1);
aTarget[0] = 0;
BaseAddMultiply(aTarget, x, y, aBase);
}
template
inline void WordBaseMultiply(T& aTarget, const T& x, const T& y)
{
aTarget.resize(1);
aTarget[0] = 0;
WordBaseAddMultiply(aTarget, x, y);
}
template
inline
bool IsZero(const T& a)
{
const typename T::value_type *ptr = &a[0];
const typename T::value_type *endptr = ptr + a.size();
while (ptr != endptr)
if (*ptr++ != 0)
return false;
return true;
}
template
inline void WordBaseDivide(T& aQuotient, T& aRemainder, T& a1, T& a2)
{
// Find the values n and m as described in Knuth II:
int n=a2.size();
assert(n>0);
assert(a2[n-1] != 0);
//a1.size() = m+n => m = a1.size()-n
int m = a1.size()-n;
assert(m>=0);
aQuotient.resize(m+1);
//D1:
//this calculates d = base/(a2[n-1]+1);
PlatDoubleWord d = WordBase/(static_cast(a2[n-1])+1);
WordBaseTimesInt(a1, d);
WordBaseTimesInt(a2, d);
a1.push_back(0);
a2.push_back(0);
//D2:
int j = m;
while (j>=0)
{
//D3:
PlatDoubleWord q = (a1[j+n]*WordBase+a1[j+n-1])/a2[n-1];
PlatDoubleWord r = (a1[j+n]*WordBase+a1[j+n-1])%a2[n-1];
REDO:
if (q == WordBase || q*a2[n-2] > WordBase*r+a1[j+n-2])
{
q = q - 1;
r = r + a2[n-1];
if (r < WordBase)
goto REDO;
}
//D4:
ANumber sub(aQuotient.Precision());
sub.CopyFrom(a2);
WordBaseTimesInt(sub, q);
sub.push_back(0);
PlatSignedDoubleWord carry;
{//Subtract the two
//TODO this can be generalized!!!!
//
// Beware though: this is not a normal subtraction. Only a
// certain set of digits ends up being subtracted.
// First check if qv isn't too big...
carry = 0;
for (int digit=0;digit<=n;digit++)
{
PlatSignedDoubleWord word;
word = ((PlatSignedDoubleWord)a1[digit+j]) -
((PlatSignedDoubleWord)sub[digit]) +
(PlatSignedDoubleWord)carry;
carry=0;
while (word<0)
{
word+=WordBase;
carry--;
}
}
if (carry)
{
q--;
sub.CopyFrom(a2);
WordBaseTimesInt(sub, q);
sub.push_back(0);
}
carry = 0;
for (int digit=0;digit<=n;digit++)
{
PlatSignedDoubleWord word;
word = ((PlatSignedDoubleWord)a1[digit+j]) -
((PlatSignedDoubleWord)sub[digit]) +
(PlatSignedDoubleWord)carry;
carry=0;
while (word<0)
{
word+=WordBase;
carry--;
}
a1[digit+j] = ((PlatWord)(word));
}
}
assert(carry == 0);
//D5:
aQuotient[j] = (typename T::value_type)q;
//D7:
j--;
}
//D8:
a1.resize(n);
PlatDoubleWord carry;
BaseDivideInt(a1, d, WordBase,carry);
aRemainder.CopyFrom(a1);
}
inline
void ANumber::Expand()
{
if (iExp+1>int(size()))
insert(end(), iExp+1-int(size()), 0);
}
================================================
FILE: cyacas/libyacas/include/yacas/arggetter.h
================================================
#ifndef YACAS_ARGGETTER_H
#define YACAS_ARGGETTER_H
#include "lispenvironment.h"
/// Get an argument that should be a short integer
int GetShortIntegerArgument(LispEnvironment& aEnvironment, int aStackTop, int iArgNr);
#endif
================================================
FILE: cyacas/libyacas/include/yacas/arrayclass.h
================================================
#ifndef YACAS_ARRAYCLASS_H
#define YACAS_ARRAYCLASS_H
#include "lispobject.h"
#include "genericobject.h"
#include
class ArrayClass final: public GenericClass
{
public:
//required
ArrayClass(std::size_t aSize,LispObject* aInitialItem);
const char* TypeName() const override;
//array-specific
std::size_t Size() const;
LispObject* GetElement(std::size_t aItem) const;
void SetElement(std::size_t aItem,LispObject* aObject);
private:
std::vector iArray;
};
inline
ArrayClass::ArrayClass(std::size_t aSize, LispObject* aInitialItem):
iArray(aSize, LispPtr(aInitialItem))
{
}
inline
const char* ArrayClass::TypeName() const
{
return "\"Array\"";
}
inline
std::size_t ArrayClass::Size() const
{
return iArray.size();
}
inline
LispObject* ArrayClass::GetElement(std::size_t aItem) const
{
assert(aItem > 0 && aItem<=iArray.size());
return iArray[aItem-1];
}
inline
void ArrayClass::SetElement(std::size_t aItem, LispObject* aObject)
{
assert(aItem > 0 && aItem<=iArray.size());
iArray[aItem-1] = aObject;
}
#endif
================================================
FILE: cyacas/libyacas/include/yacas/associationclass.h
================================================
/*
* This file is part of yacas.
* Yacas is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesset General Public License as
* published by the Free Software Foundation, either version 2.1
* of the License, or (at your option) any later version.
*
* Yacas 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with yacas. If not, see .
*
*/
/*
* File: associationclass.h
* Author: mazur
*
* Created on September 29, 2015, 3:44 PM
*/
#ifndef ASSOCIATIONCLASS_H
#define ASSOCIATIONCLASS_H
#include "lispobject.h"
#include "genericobject.h"
#include "standard.h"
#include