Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

open-axiom repository from github

24005 views
1
// Copyright (C) 2014, Gabriel Dos Reis.
2
// All rights reserved.
3
// Written by Gabriel Dos Reis.
4
//
5
// Redistribution and use in source and binary forms, with or without
6
// modification, are permitted provided that the following conditions are
7
// met:
8
//
9
// - Redistributions of source code must retain the above copyright
10
// notice, this list of conditions and the following disclaimer.
11
//
12
// - Redistributions in binary form must reproduce the above copyright
13
// notice, this list of conditions and the following disclaimer in
14
// the documentation and/or other materials provided with the
15
// distribution.
16
//
17
// - Neither the name of OpenAxiom nor the names of its contributors
18
// may be used to endorse or promote products derived from this
19
// software without specific prior written permission.
20
//
21
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
24
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
25
// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33
// --% Author: Gabriel Dos Reis
34
35
#include <open-axiom/Lisp>
36
#include <iostream>
37
#include <string>
38
39
static OpenAxiom::Sexpr::RawInput
40
raw_input(const std::string& line, OpenAxiom::Ordinal lineno) {
41
if (line.empty())
42
return { nullptr, nullptr, lineno };
43
auto p = reinterpret_cast<const OpenAxiom::Byte*>(&line[0]);
44
return { p, p + line.size(), lineno };
45
}
46
47
int main(int argc, char* argv[]) {
48
using namespace OpenAxiom;
49
Lisp::Evaluator lisp;
50
51
const char* prompt = "*> ";
52
std::string line;
53
Ordinal lineno { };
54
while (true) {
55
std::cout << prompt;
56
if (!std::getline(std::cin, line))
57
break;
58
else if (line.empty())
59
continue;
60
Sexpr::Reader reader { raw_input(line, ++lineno) };
61
while (true) {
62
try {
63
auto s = reader.read();
64
if (s == nullptr)
65
break;
66
auto value = lisp.eval(s);
67
Lisp::format(value, std::cout);
68
std::cout << '\n';
69
}
70
catch (const OpenAxiom::Diagnostics::BasicError& e) {
71
std::cerr << e.message() << std::endl;
72
}
73
}
74
}
75
76
std::cout << std::endl;
77
}
78
79
80