这是一个JSON实例,显示会议的开始时间和结束时间:
{
"start time": "2015-02-19T08:00:00Z",
"end time": "2015-02-19T09:00:00Z"
}
Run Code Online (Sandbox Code Playgroud)
我可以使用JSON Schema指定该实例的结构:实例必须包含具有"start time"属性和"end time"属性的对象,并且每个属性必须是日期时格式化的字符串.请参阅下面的JSON模式.但我无法指明的是:会议必须在会议结束前开始.也就是说,"开始时间"的值必须小于"结束时间"的值.有些人将这种数据依赖性称为共同约束.在XML世界中,有一种用于表达共同约束的精彩,简单的技术:Schematron.我想知道JSON世界中是否有相同的技术?你会用什么来声明性地描述"开始时间"和"结束时间"之间的关系?(注意:用某种编程语言编写代码并不是我所说的"声明性地描述关系".我正在寻找一种声明方法来描述JSON文档中存在的数据依赖关系,而不是程序代码.)
{
"$schema": "http://json-schema.org/draft-04/schema#",
"definitions": {
"meeting": {
"type": "object",
"properties": {
"start time": { "type": "string", "format": "date-time"},
"end time": { "type": "string", "format": "date-time"}
},
"required": [ "start time", "end time" ],
"additionalProperties": false
}
},
"$ref": "#/definitions/meeting"
}
Run Code Online (Sandbox Code Playgroud) 这是一个使用 propertyNames 的 JSON 模式:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"propertyNames": {"enum": ["num", "name"]}
}
Run Code Online (Sandbox Code Playgroud)
我“认为”该模式的含义是:符合要求的 JSON 实例必须是一个对象,并且该对象必须包含一个“num”属性和一个“name”属性;这两个属性的值未指定。这是正确的,这是架构的意思吗?
我创建了这个实例:
{
"num": 10
}
Run Code Online (Sandbox Code Playgroud)
我根据架构验证了该实例,验证器说它是有效的。嗯,为什么?模式不是指定对象必须同时包含“num”和“name”吗?
我正在阅读一些实现简单解析器的代码。一个名为的函数将scan一行分解为标记。scan有一个静态变量bp,分配给要标记的行。在分配之后,空格被跳过。见下文。我不明白的是为什么代码对bp指向 with的字符进行按位和处理0xff,即, 的目的是* bp & 0xff什么?这怎么样:
while (isspace(* bp & 0xff))
++ bp;
Run Code Online (Sandbox Code Playgroud)
与此不同:
while (isspace(* bp))
++ bp;
Run Code Online (Sandbox Code Playgroud)
这是scan函数:
static enum tokens scan (const char * buf)
/* return token = next input symbol */
{ static const char * bp;
while (isspace(* bp & 0xff))
++ bp;
..
}
Run Code Online (Sandbox Code Playgroud) 在ANTRL4书的第74页上,它表示只需通过以下方式指定其代码点,就可以在语法中使用任何Unicode字符:
'\uxxxx'
Run Code Online (Sandbox Code Playgroud)
其中xxxx是Unicode代码点的十六进制值.
所以我在ID令牌的令牌规则中使用了这种技术:
grammar ID;
id : ID EOF ;
ID : ('a' .. 'z' | 'A' .. 'Z' | '\u0100' .. '\u017E')+ ;
WS : [ \t\r\n]+ -> skip ;
Run Code Online (Sandbox Code Playgroud)
当我试图解析这个输入时:
G?nter
Run Code Online (Sandbox Code Playgroud)
ANTLR抛出一个错误,说它无法识别?.(ŭ字符是十六进制016D,因此它在指定的范围内)
我做错了什么?
I am reading the online book Object-Oriented Programming with ANSCI-C
Page 6 shows an implementation of a set. There is an add() function that takes two parameters: a set and an element. The element is added to the set. The implementation uses an array of pointers:
static int heap [MANY];
Run Code Online (Sandbox Code Playgroud)
Here is the beginning of the add() function:
void * add (void * _set, const void * _element)
{
int * set = _set;
const int * …Run Code Online (Sandbox Code Playgroud) 这个Lambda函数返回1:
(\x y -> 1) 1 p
Run Code Online (Sandbox Code Playgroud)
其中p =(\ xy - > 1)
好吧,这对我来说很有意义 - Lambda函数返回1,与其参数无关.
现在,这个Lambda函数生成一个错误(无限类型错误):
(\x y -> x y x) p 1
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义.如果该函数应用于这里的参数是将p替换为x而将1替换为y的结果:
p 1 p
Run Code Online (Sandbox Code Playgroud)
将第一个p替换为其定义:
(\x y -> 1) 1 p
Run Code Online (Sandbox Code Playgroud)
嘿! 这与上面的相同,返回1.
问题:为什么(\ xy - > 1)1 p成功而(\ xy - > xyx)p 1失败?
/罗杰
我现在明白了类型签名s (s k):
s (s k) :: ((t1 -> t2) -> t1) -> (t1 -> t2) -> t1
Run Code Online (Sandbox Code Playgroud)
我可以在Haskell WinGHCi工具中创建无错误的示例:
示例:
s (s k) (\g -> 2) (\x -> 3)
Run Code Online (Sandbox Code Playgroud)
回报2.
示例:
s (s k) (\g -> g 3) successor
Run Code Online (Sandbox Code Playgroud)
回报4.
其中successor定义如下:
successor = (\x -> x + 1)
Run Code Online (Sandbox Code Playgroud)
尽管如此,我仍然没有一个直观的感受了什么s (s k)呢.
该组合子s (s k)采取任何两个函数f和g.什么是s (s k)用做f …
lambda haskell combinators lambda-calculus combinatory-logic
我在一本关于可计算性的书中读过这篇文章:
(Kleene定理)当且仅当它可以通过应用三个运算联合,连接,重复有限次数从有限语言获得时,语言是规则的.
我正在与"有限语言"斗争.
考虑这种语言: L = a*
它不是有限的.它是一个{0, a, aa, aaa, ...}显然是无限集(0=空字符串)的集合.
所以这是一种无限的语言,对吗?也就是说,"无限集"意味着"无限语言",对吧?
显然,这a*是一种常规语言.它是一种无限的语言.因此,通过Kleene的定理,它不能成为常规语言.矛盾.
我糊涂了.我想我不知道"有限语言"是什么意思.
computability finite-automata regular-language formal-languages kleene-star
这是一个常见的Lisp数据表示问题。
代表语法的好方法是什么?“好的”是指表示简单,易于理解的表示形式,并且我可以在表示形式上进行操作而不必大惊小怪。表示不必特别有效;其他属性(简单,可理解,可处理)对我来说更重要。
这是一个示例语法:
Session ? Facts Question
Session ? ( Session ) Session
Facts ? Fact Facts
Facts ? ?
Fact ? ! STRING
Question ? ? STRING
Run Code Online (Sandbox Code Playgroud)
表示形式应允许对表示形式进行操作的代码易于区分终端符号和非终端符号。
非终端符号: Session, Facts, Fact, Question
端子符号: (, ), ?, !, ?
这种特殊的语法使用括号符号,这与Common Lisp使用括号符号相冲突。有什么好的方法来解决这个问题?
我希望我的代码能够识别空字符串的符号?。代表空字符串的符号的好方法是什么??
我希望我的代码能够区分语法规则的左侧和右侧。
以下是我要对表示形式执行的一些常见操作。
考虑以下规则:
A ? u1u2...un
Run Code Online (Sandbox Code Playgroud)
操作:我想获得语法规则右侧的第一个符号。然后我想知道:这是一个终端符号吗?是?符号吗?如果它是一个非结束符号,那么我想获得其语法规则。
一些编程问题不需要图灵机的全部功能来解决.它们可以用更少的功率解决.我正在寻找功能较弱的编程语言.
是否存在仅限于支持这些功能的高级编程语言:
具有将值推入堆栈并将值从堆栈中弹出的操作的堆栈.
有限状态机(FSM)用于输入值,从状态移动到状态,与堆栈交互以及输出结果.
我意识到我可以使用Java或C或Python(等)并通过编写仅使用堆栈和FSM的程序来约束语言.但是,我正在寻找一种只具备这些功能的编程语言,而不是更多.
换句话说,我不想使用图灵完整的编程语言来解决只需要确定性下推自动机功能的问题.我想使用只具有确定性下推自动机功能的编程语言.
stack deterministic state-machine turing-complete pushdown-automaton
c ×2
grammar ×2
haskell ×2
lambda ×2
antlr ×1
antlr4 ×1
bitwise-and ×1
char ×1
combinators ×1
common-lisp ×1
dependencies ×1
isspace ×1
json ×1
jsonschema ×1
kleene-star ×1
schema ×1
schematron ×1
stack ×1
token ×1
unicode ×1