Class expression or chain property for making inference in Protégé - ontology

I have the following question:
In the ontology below, I have four word instances: super, first-rate, word1 and word2 and two compound instances: super-word1 and first-rate-word2. word relate to compound instances with part-whole relationships. I want to infer that, since super is synonym of first-rate, then super-word1 is synonym of first-rate-word2. I also do not want that super-word1 is synonym of first-rate and that first-rate-word2 is synonym of super.
Any help??? You can also replace both word1 and word2 with just one word instance.
PS. I am using Protégé, so a simple DL syntax would be appreciated.
Many Thanks
Nik
#prefix : <http://www.semanticweb.org/myontology#> .
#prefix owl: <http://www.w3.org/2002/07/owl#> .
#prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
#prefix xml: <http://www.w3.org/XML/1998/namespace> .
#prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
#prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
#base <http://www.semanticweb.org/myontology> .
<http://www.semanticweb.org/myontology> rdf:type owl:Ontology .
#################################################################
# Object Properties
#################################################################
### http://www.semanticweb.org/myontology#has_part
:has_part rdf:type owl:ObjectProperty ;
rdfs:subPropertyOf owl:topObjectProperty ;
owl:inverseOf :is_part_of ;
rdfs:domain :compound ;
rdfs:range :word .
### http://www.semanticweb.org/myontology#is_part_of
:is_part_of rdf:type owl:ObjectProperty ;
rdfs:subPropertyOf owl:topObjectProperty ;
rdfs:domain :word ;
rdfs:range :compound .
### http://www.semanticweb.org/myontology#is_synonym_of
:is_synonym_of rdf:type owl:ObjectProperty ;
rdfs:subPropertyOf owl:topObjectProperty ;
rdf:type owl:SymmetricProperty ;
rdfs:domain :word ;
rdfs:range :word .
#################################################################
# Classes
#################################################################
### http://www.semanticweb.org/myontology#compound
:compound rdf:type owl:Class .
### http://www.semanticweb.org/myontology#word
:word rdf:type owl:Class .
#################################################################
# Individuals
#################################################################
### http://www.semanticweb.org/myontology#first-rate
:first-rate rdf:type owl:NamedIndividual ,
:word ;
:is_part_of :first-rate-word2 .
### http://www.semanticweb.org/myontology#first-rate-word2
:first-rate-word2 rdf:type owl:NamedIndividual ,
:compound ;
:has_part :first-rate ,
:word2 .
### http://www.semanticweb.org/myontology#super
:super rdf:type owl:NamedIndividual ,
:word ;
:is_part_of :super-word1 ;
:is_synonym_of :first-rate .
### http://www.semanticweb.org/myontology#super-word1
:super-word1 rdf:type owl:NamedIndividual ,
:compound ;
:has_part :super ,
:word1 .
### http://www.semanticweb.org/myontology#word1
:word1 rdf:type owl:NamedIndividual ,
:word .
### http://www.semanticweb.org/myontology#word2
:word2 rdf:type owl:NamedIndividual ,
:word .
### Generated by the OWL API (version 4.5.9.2019-02-01T07:24:44Z)
https://github.com/owlcs/owlapi

Here is a minimal ontology that will achieve these inferences:
#prefix : <http://www.semanticweb.org/myontology#> .
#prefix owl: <http://www.w3.org/2002/07/owl#> .
#prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
#prefix xml: <http://www.w3.org/XML/1998/namespace> .
#prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
#prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
#base <http://www.semanticweb.org/myontology> .
<http://www.semanticweb.org/myontology> rdf:type owl:Ontology .
:has_part rdf:type owl:ObjectProperty .
:is_synonym_of rdf:type owl:ObjectProperty ;
rdfs:subPropertyOf owl:topObjectProperty ;
rdf:type owl:SymmetricProperty ;
owl:propertyChainAxiom ( :has_part
:is_synonym_of
) .
:first-rate rdf:type owl:NamedIndividual .
:first-rate-word2 rdf:type owl:NamedIndividual ;
:has_part :first-rate .
:super rdf:type owl:NamedIndividual ;
:is_synonym_of :first-rate .
:super-word1 rdf:type owl:NamedIndividual ;
:has_part :super .
The key bit is the following:
:is_synonym_of rdf:type owl:ObjectProperty ;
rdfs:subPropertyOf owl:topObjectProperty ;
rdf:type owl:SymmetricProperty ;
owl:propertyChainAxiom ( :has_part
:is_synonym_of
) .

Related

CSV::MalformedCSVError: New line must be <"\n\r">

Trying to parse this file with Ruby CSV.
https://www.sec.gov/files/data/broker-dealers/company-information-about-active-broker-dealers/bd070219.txt
However, I am getting an error.
CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => "\n\r" }).each do |row|
puts row
end
CSV::MalformedCSVError: New line must be <"\n\r"> not <"\r"> in line
1.
Windows row_sep is "\r\n", not "\n\r". However this CSV is malformed. Looking at it using a hex editor it appears to be using "\r\r\n".
It's tab-delimited.
In addition it is not using proper quoting, line 247 has 600 "B" STREET STE. 2204, so you need to turn off quote characters.
quote_char: nil, col_sep: "\t", row_sep: "\r\r\n"
There's an extra tab on the end, each line ends with \t\r\r\n. You can also look at it as using a row_sep of "\r\n" with an extra \r field.
quote_char: nil, col_sep: "\t", row_sep: "\r\n"
Or you can view it as having a row_sep of \t\r\r\n and no extra field.
quote_char: nil, col_sep: "\t", row_sep: "\t\r\r\n"
Either way, it's a mess.
I used a hex editor to look at the file as text and raw data side by side. This let me see what's truly at the end of the line.
87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef
00000000: 3030 3030 3030 3139 3034 0941 4252 4148 0000001904.ABRAH
00000010: 414d 2053 4543 5552 4954 4945 5320 434f AM SECURITIES CO
00000020: 5250 4f52 4154 494f 4e09 3030 3832 3934 RPORATION.008294
00000030: 3532 0933 3732 3420 3437 5448 2053 5452 52.3724 47TH STR
00000040: 4545 5420 4354 2e20 4e57 0920 0947 4947 EET CT. NW. .GIG
00000050: 2048 4152 424f 5209 5741 0939 3833 3335 HARBOR.WA.98335
00000060: 090d 0d0a 3030 3030 3030 3233 3033 0950 ....0000002303.P
^^^^^^^^^
Hex 09 0d 0d 0a is \t\r\r\n.
Alternatively, you can print the lines with p and any invisible characters will be revealed.
f = File.open(file_name)
p f.readline
"0000001904\tABRAHAM SECURITIES CORPORATION\t00829452\t3724 47TH STREET CT. NW\t \tGIG HARBOR\tWA\t98335\t\r\r\n"
Use :row_sep => :auto instead of :row_sep => "\n\r":
CSV.open(file_name, "r", { :col_sep => "\t", :row_sep => :auto }).each do |row|
puts row
end

Antlr4: How to change my grammar to let chained elements being parsed?

I need a grammar to parse double dots delimited tokens like:
1..5, v[1]..v[2] or 1+f(1)..2+v[f(2)]..3+f(3).
Basically, these tokens represent integer ranges, for ex, 1..5 means integers in range 1 to 5. Token literal should only be represented as "Integer..Integer"
I also have to parse some integer literals and real literals as well.
So currently, I have a bottom up grammar like:
unary_expr
: range_expr # ToRangeExpr
| PLUS rhs=unary_expr # UnaryPlusExpr
| MINUS rhs=unary_expr # UnaryMinusExpr
| NOT rhs=unary_expr # UnaryNotExpr
;
range_expr
: index_expr # ToIndexExpr
| lhs=index_expr RANGEDOT rhs=index_expr # RangeExpr
| lhs=range_literal rhs=index_expr # RangeLiteralExpr
;
index_expr
: atom # ToAtom
| atom LBRACK expression RBRACK # IndexExpr
;
atom
: vector_atom # ToVectorAtom
| matrix_atom # ToMatrixAtom
| boolean_literal # ToBooleanLiteral
| int_literal # ToIntegerLiteral
| real_literal # ToRealLiteral
| char_literal # ToCharLiteral
| string_literal # ToStringLiteral
| tuple_literal # ToTupleLiteral
| range_literal # ToRangeLiteral
| tuple_element # ToTupleElement
| type_cast # ToTypeCast
| stream_state # ToStreamState
| function_call # ToFunctionCall
| ID # IDAtom
| IDENTITY # IdentityLiteral
| NULL # NullLiteral
| LPAREN expression RPAREN # ToSubExpr
range_literal: RANGE_LITERAL;
RANGE_LITERAL
: INT_LITERAL RANGEDOT INT_LITERAL
;
REAL_LITERAL
: DOT US+ INT_LITERAL REAL_EXP?
| INT_LITERAL DOT US* INT_LITERAL? REAL_EXP?
| INT_LITERAL REAL_EXP
| DOT INT_LITERAL REAL_EXP
;
REAL_EXP
: 'e' US* (PLUS | MINUS |)? US* INT_LITERAL
;
INT_LITERAL: NUM (NUM | US)*;
So currently, my grammar can parse multiple-integer-chained range tokens. However, I can't parse any multiple-expression-chained range tokens. I tried to change my range_expr as (make it more ambiguous):
range_expr
: range_literal
| index_expr (RANGEDOT index_expr*)
;
But, it didn't change my parsing sensitivities. So what else change should I make to let my grammar parse multiple index_expr chained range tokens?
Explanation
I couldn't reuse your grammar (because of the missing lexer/parser rules) but if I understand the problem correctly: you want to have a simple range of two numbers or to chain together an arbitrary number of expr. Idea for this is to have a sub-rule in index_expr that will match range of numbers (a specialized version of exprChain) and to have a recursive definition of expr that will consist of a chaining expression (exprChain).
Solution
As an example of the idea I introduce small grammar.
grammar test;
INT : [0-9]+;
REAL : [0-9]* '.' [0-9]+;
NAME : [a-zA-Z]+;
numeric
: INT | REAL
;
reference
: NAME # variable
| NAME '[' expr ']' # array
| NAME '(' expr ')' # functionCall
;
index_expr
: numeric '..' numeric # rangeOfNumbers
| expr # classicExpr
;
expr
: expr '+' expr # exprAdd
| reference # exprRef
| numeric # exprNumber
| expr '..' expr # exprChain
;
This example grammar is able to match all the ranged expressions you mentioned: 1..5 or .1...3 (as rangeOfNumbers), v[1]..v[2] or 1+f(1)..2+v[f(2)]..3+f(3) (both as exprChain).
The problem is I can't treat range_expr as unary_expr in my grammar, because it will confuse antlr4 with the real_literal option, and force antlr4 match logic_expr tokens (i.e xor, or, which I didn't show them in my question). After my micro fix, the partial grammar will be like:
unary_expr
: index_expr # ToIndexExpr
| PLUS rhs=unary_expr # UnaryPlusExpr
| MINUS rhs=unary_expr # UnaryMinusExpr
| NOT rhs=unary_expr # UnaryNotExpr
;
index_expr
: atom # ToAtom
| atom LBRACK expression RBRACK # IndexExpr
| lhs=index_expr RANGEDOT rhs=index_expr # RangeExpr
| lhs=range_literal rhs=index_expr # RangeLiteralExpr
;
atom
: vector_atom # ToVectorAtom
| matrix_atom # ToMatrixAtom
| boolean_literal # ToBooleanLiteral
| int_literal # ToIntegerLiteral
| real_literal # ToRealLiteral
| char_literal # ToCharLiteral
| string_literal # ToStringLiteral
| tuple_literal # ToTupleLiteral
| range_literal # ToRangeLiteral
| tuple_element # ToTupleElement
| type_cast # ToTypeCast
| stream_state # ToStreamState
| function_call # ToFunctionCall
| ID # IDAtom
| IDENTITY # IdentityLiteral
| NULL # NullLiteral
| LPAREN expression RPAREN # ToSubExpr
;
real_literal: REAL_LITERAL # RealLiteral
| DOT INT_LITERAL # EdgeCaseRealLiteral;
range_literal: RANGE_LITERAL;
RANGE_LITERAL
: INT_LITERAL RANGEDOT
;
REAL_LITERAL
: DOT US+ INT_LITERAL REAL_EXP?
| INT_LITERAL DOT US* INT_LITERAL? REAL_EXP?
| INT_LITERAL REAL_EXP
| DOT INT_LITERAL REAL_EXP
;
REAL_EXP
: 'e' US* (PLUS | MINUS |)? US* INT_LITERAL
;
INT_LITERAL: NUM (NUM | US)*;

What is the base directory for Zend ViewModel setTemplate?

I'm trying to load a different view depending on the value taken from a Regex route, but I can't get the ViewModel to load the template
public function viewAction()
{
$page = $this->params()->fromRoute()["page"];
$view = new ViewModel();
$view->setTemplate('module/Base/view/base/index/$page');
return $view;
}
I'm following the conventional module setup:
Base
|- config
| |- module.config.php
|- src
| |- Base
| |- Controller
| |- IndexController.php
|- view
|- base
| |- index
| |- index.phtml
| |- other.phtml
|- layout
And my view_manager configuration is:
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
I've tried all sort of values in the path passed to setTemplate, but I just keep getting the application error message, but no error log or details (that may be because I haven't figured out displaying errors properly). I have confirmed that $page is getting the name of the template correctly from the URL, and the template is in the correct directory.
So, where does ViewModel start looking for templates?
I've tried:
$view->setTemplate('$page.phtml');
$view->setTemplate('$page');
$view->setTemplate('base/index/$page.phtml');
$view->setTemplate('base/index/$page');
$view->setTemplate('module/Base/view/base/index/$page.phtml');
$view->setTemplate('module/Base/view/base/index/$page');
Each module that requires view scripts should have a view_manager key in module.config.php
You have two choices when registering view scripts.
'view_manager' => [
'template_map' => [
'module-name/foo/bar' => __DIR__ . '/../view/foo/bar.phtml',
'custom_view_template_name' => __DIR__ . '/../view/some/other/path/bar.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
],
Template Path Stack
This represents a collection (stack) of paths that the view resolver will try to find paths from.
The view scripts that you set on the view models in the controller would then be relative to this directory path. This option saves you time by 'automatically' resolving view script paths using a common naming convention.
For example, if you have FooModule and the file FooModule/view/foo-module/index/index.phtml the template path that should be used in the controller would be foo-module/index/index.
Template Map
A one to one mapping of template name to template path. This means the template path is exactly the same as the array key.
You should try to favor this method as using the template_path_stack incurs a slight performance hit as the view scripts need to be resolved at runtime.
I am using it like this:
after the view folder inside your module add the path. So I assume yours is
view->setTemplate('base/index/$page');
This should do the trick.

How to load a custom library in Zend Framework 2?

I've been following this guide (http://socialsemanticweb.blogspot.com.au/2012/11/zend-framework-2-create-custom-library.html) but I can't get Zend to see my library (error message below).
Any ideas what could be wrong? thanks
my folder structure
my MyLibraryController.php
<?php
namespace MyLibrary\Mvc\Controller;
use Zend\Mvc\Controller\AbstractActionController;
class MyLibraryController extends AbstractActionController {
public function __construct() {
}
public function doSomething() {
//instantiate your model here and return result
$result = "test";
return $result;
}
}
my autoload_namespaces.php (inside vendor\composer)
<?php
// autoload_namespaces.php generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'Zend\\' => $vendorDir . '/zendframework/zendframework/library/',
'ZendTest\\' => $vendorDir . '/zendframework/zendframework/tests/',
'Symfony\\Component\\Console\\' => $vendorDir . '/symfony/console/',
'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
'DoctrineORMModule\\' => $vendorDir . '/doctrine/doctrine-orm-module/src/',
'DoctrineORMModuleTest\\' => $vendorDir . '/doctrine/doctrine-orm-module/tests/',
'DoctrineModule\\' => $vendorDir . '/doctrine/doctrine-module/src/',
'DoctrineModuleTest\\' => $vendorDir . '/doctrine/doctrine-module/tests/',
'MyLibrary\\' => $vendorDir . '/MyLibrary/library/',
);
my application.config.php (I've only added the MyLibrary entry. I've tried with and without it)
<?php
return array(
// This should be an array of module namespaces used in the application.
'modules' => array(
'Application',
'DoctrineModule',
'DoctrineORMModule',
'Directory',
'Helpers',
'MyLibrary',
error message without adding MyLibrary module in application.config.php
Fatal error: Class 'Directory\Controller\MyLibaryController' not found in D:\work\eclipse\htdocs\directory\module\Directory\src\Directory\Controller\DirectoryController.php on line 17
error message with MyLibrary module entry in application.config.php
Fatal error: Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException' with message 'Module (MyLibrary) could not be initialized.' in D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php:175 Stack trace: #0 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent)) #1 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('MyLibrary') #2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent)) #3 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent)) #4 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library in D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php on line 175
First off, it's not a module, so the error message you get by adding it to the modules array of app config is to be expected.
Editing autoload_namespaces.php to add your library (as you already have) should work.
That said, a more correct way is to add the autoload key to your root composer.json file and do the mapping there
{
"require": {
"php": ">=5.3.3",
"zendframework/zendframework": ">2.2.0rc1"
},
"autoload": {
"psr-0": {"MyLibrary\\": "vendor/MyLibrary/library/"}
}
}
After doing that, from the command line run composer.phar update, and it will automatically add your library to the autoload_namespaces file for you. Doing it that way means you don't have to manually edit the file every time you update your other libraries with composer.
To the error itself
Fatal error: Class 'Directory\Controller\MyLibaryController' not found in D:\work\eclipse\htdocs\directory\module\Directory\src\Directory\Controller\DirectoryController.php on line 17
I'm guessing that with autoloading taken care of, you're just missing a use statement in your DirectoryController class
<?php
namespace Directory\Controller;
// be sure to use your library controller
use MyLibrary\Mvc\Controller\MyLibraryController;
class DirectoryController extends MyLibraryController
{
//..
}

Parsing trouble with amotoen

I'm trying to write a grammar to parse a simple language to describe drum loops, using Clojure and amotoen. The language looks like this:–
# Test Loop
# this is a comment
BPM: 100
Samples:
BD: bd.wav
SD: sd.wav
CHH: chh.wav
CSH: csh.wav
Body:
BD: /---/---/---/---
SD: ---/--/--/-/--/-
CHH: --/---/---/---/-
CSH: /---------------
# this is another comment
I've defined the grammar as follows:–
(def g {
:Whitespace '(| \space \newline \tab \, :Comment)
:_* '(* :Whitespace)
:_ [:Whitespace '(* :Whitespace)]
:Comment [\# '(* (% \newline)) \newline]
:BPM [\B \P \M \: :_* '(* :Number) \newline]
:Number '(* :Digit)
:Digit (a/lpegs '| "0123456789")
:Samples [\S \a \m \p \l \e \s \: \newline '(* :SampleDef)]
:SampleDef [:_* :Name \: :_* :File \newline]
:Name '(* (% \:))
:File '(* (% \newline))
:Body [\B \o \d \y \: \newline '(* :Pattern)]
:Pattern [:_* :Name \: :_* '(* (| \/ \-)) '(| \newline \$)]
:Document [:_* :BPM :_* :Samples :_* :Body :_* \$]
})
When I call pegasus on each part of a sample file individually, they are parsed correctly. For example:–
(pprint
(a/pegasus
:Body
g
(a/wrap-string
"Body:\n
BD: /---/---/---/---\n
SD: ---/--/--/-/--/-\n
CHH: --/---/---/---/-\n
CSH: /---------------\n")))
However, when I call (pprint (a/pegasus :Document g (a/wrap-string (slurp "sample.orc")))), all I get is nil. Similarly if I replace (a/wrap-string (slurp "sample.orc")) with a string containing the text contained in sample.orc.
So, my question is: can anyone spot what's wrong with my grammar? I'm all out of ideas, and I've been staring at it for a few days now. I'm sure it's something embarrassingly simple, but I just can't see it!
Thanks in advance.
The :Samples rule consumes the :Body, :File can be empty and end-of-input should be marked by :$ not \$. Here's an amended grammar:
(def g
{
:Whitespace '(| \space \tab \, :Comment)
:n* '(* (| \newline :Comment))
:_* '(* :Whitespace)
:_ [:Whitespace '(* :Whitespace)]
:Comment [\# '(* (% \newline)) \newline]
:BPM [\B \P \M \: :_* '(* :Number) \newline]
:Number '(* :Digit)
:Digit (a/lpegs '| "0123456789")
:Samples [\S \a \m \p \l \e \s \: \newline '(* :SampleDef)]
:SampleDef [:_* :Name \: :_* :File \newline]
:Name '[(% \:) (* (% \:))]
:File '[(% \newline) (* (% \newline))]
:Body [\B \o \d \y \: \newline '(* :Pattern)]
:Pattern [:_* :Name \: :_* '(* (| \/ \-)) '(| \newline :$)]
:Document [:n* :BPM :n* :Samples :n* :Body :n* :$]
})
;; sample.orc contains the example input from the question text
(pprint (a/pegasus :Document g (a/wrap-string (slurp "sample.orc"))))
;; output:
{:Document
[{:n*
({:Comment [\# (\space \T \e \s \t \space \L \o \o \p) \newline]}
{:Comment
[\#
(\space
\t
\h
\i
\s
\space
\i
\s
\space
\a
\space
\c
\o
\m
\m
\e
\n
\t)
\newline]}
\newline)}
{:BPM
[\B
\P
\M
\:
{:_* {:Whitespace \space}}
{:Number ({:Digit \1} {:Digit \0} {:Digit \0})}
\newline]}
{:n* \newline}
{:Samples
[\S
\a
\m
\p
\l
\e
\s
\:
\newline
({:SampleDef
[{:_* {:Whitespace \space}}
{:Name [\B \D]}
\:
{:_* {:Whitespace \space}}
{:File [\b (\d \. \w \a \v)]}
\newline]}
{:SampleDef
[{:_* {:Whitespace \space}}
{:Name [\S \D]}
\:
{:_* {:Whitespace \space}}
{:File [\s (\d \. \w \a \v)]}
\newline]}
{:SampleDef
[{:_* ()}
{:Name [\C (\H \H)]}
\:
{:_* {:Whitespace \space}}
{:File [\c (\h \h \. \w \a \v)]}
\newline]}
{:SampleDef
[{:_* ()}
{:Name [\C (\S \H)]}
\:
{:_* {:Whitespace \space}}
{:File [\c (\s \h \. \w \a \v)]}
\newline]})]}
{:n* \newline}
{:Body
[\B
\o
\d
\y
\:
\newline
({:Pattern
[{:_* {:Whitespace \space}}
{:Name [\B \D]}
\:
{:_* {:Whitespace \space}}
(\/ \- \- \- \/ \- \- \- \/ \- \- \- \/ \- \- \-)
\newline]}
{:Pattern
[{:_* {:Whitespace \space}}
{:Name [\S \D]}
\:
{:_* {:Whitespace \space}}
(\- \- \- \/ \- \- \/ \- \- \/ \- \/ \- \- \/ \-)
\newline]}
{:Pattern
[{:_* ()}
{:Name [\C (\H \H)]}
\:
{:_* {:Whitespace \space}}
(\- \- \/ \- \- \- \/ \- \- \- \/ \- \- \- \/ \-)
\newline]}
{:Pattern
[{:_* ()}
{:Name [\C (\S \H)]}
\:
{:_* {:Whitespace \space}}
(\/ \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-)
\newline]})]}
{:n*
(\newline
{:Comment
[\#
(\space
\t
\h
\i
\s
\space
\i
\s
\space
\a
\n
\o
\t
\h
\e
\r
\space
\c
\o
\m
\m
\e
\n
\t)
\newline]})}
:$]}

Resources