Skip to main content

oak_wolfram/
lib.rs

1#![doc = include_str!("readme.md")]
2#![feature(new_range_api)]
3#![doc(html_logo_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
4#![doc(html_favicon_url = "https://raw.githubusercontent.com/ygg-lang/oaks/refs/heads/dev/documents/logo.svg")]
5#![warn(missing_docs)]
6//! Wolfram support for the Oak language framework.
7
8pub mod ast;
9mod builder;
10pub mod language;
11pub mod lexer;
12#[cfg(any(feature = "lsp", feature = "oak-highlight", feature = "oak-pretty-print"))]
13pub mod lsp;
14pub mod parser;
15
16pub use crate::{builder::WolframBuilder, language::WolframLanguage, lexer::WolframLexer, parser::WolframParser};
17pub use lexer::token_type::WolframTokenType;
18pub use oak_core::{ElementType, TokenType};
19pub use parser::element_type::WolframElementType;
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24    use oak_core::{Builder, SourceText, parser::ParseSession};
25
26    #[test]
27    fn test_functional_parsing() {
28        let language = WolframLanguage::default();
29        let builder = WolframBuilder::new(&language);
30        let mut session = ParseSession::<WolframLanguage>::default();
31
32        let code = "f @ x + g /@ list // h";
33        let source = SourceText::new(code);
34        let output = builder.build(&source, &[], &mut session);
35
36        assert!(output.result.is_ok());
37        // 可以在这里进一步检查树的结构,但至少解析成功了
38    }
39
40    #[test]
41    fn test_pure_function() {
42        let language = WolframLanguage::default();
43        let builder = WolframBuilder::new(&language);
44        let mut session = ParseSession::<WolframLanguage>::default();
45
46        let code = "# + 1 &";
47        let source = SourceText::new(code);
48        let output = builder.build(&source, &[], &mut session);
49
50        assert!(output.result.is_ok());
51    }
52
53    #[test]
54    fn test_apply_level_and_map_all() {
55        let language = WolframLanguage::default();
56        let builder = WolframBuilder::new(&language);
57        let mut session = ParseSession::<WolframLanguage>::default();
58
59        let code = "f @@@ expr + g //@ list";
60        let source = SourceText::new(code);
61        let output = builder.build(&source, &[], &mut session);
62
63        assert!(output.result.is_ok());
64    }
65
66    #[test]
67    fn test_nested_calls() {
68        let language = WolframLanguage::default();
69        let builder = WolframBuilder::new(&language);
70        let mut session = ParseSession::<WolframLanguage>::default();
71
72        let code = "f[x][y][z]";
73        let source = SourceText::new(code);
74        let output = builder.build(&source, &[], &mut session);
75
76        assert!(output.result.is_ok());
77    }
78}