e4x风格的python嵌入式dsl,但没有e和x
P4D-Langlet的Python项目详细描述
p4d不是python,但它也很有趣
p4d(=python for data)是用于编写树状结构的EasyExtend langlet 文本数据,也就是XML。
p4d元素以python所熟悉的符号作为语句编写 程序员。它们与python语句非常相似。这里有一个用来定义 元素
elm philosophers: philosopher: name: "Hegel" books: book( first_edition = 1807): title: "Phänomenologie des Geistes" language: "german" philosopher: name: "Leibniz" books: book( first_edition = 1714): title: "Monadologie" language: "french"
elm关键字是新的,它是p4d中断的少数情况之一。 实际的 python代码。但是我没有发现在pythons stdlib中使用elm,所以 可以 一点也没有。
philosophers的子对象可以用e4x样式访问
books = philosophers.philosopher.(name == "Hegel").books books.book.(@first_edition < 1810).title.text() # -> "Phänomenologie des Geistes"
p4d还可以用作template语言在python的意义上 表达式可以嵌入到p4d元素中
L = [1,2,3] elm A: B: &L elm X: & A
list对象L的元素将分布在类型b的元素上
assert len(A.B) == 3 assert X.A.B[0].text() == '1'
使用^{tt5}很容易将p4d元素转换为xml元素$ 方法。 否则,可以使用P4D.from_xml()将xml转换为p4d。这太简单了 因为 内部使用相同的数据结构。构建p4d元素并分析 XML文档会导致相同的内部表示。这个内部 表示可用于存储更为不同的对象,这些对象具有 不同的属性,甚至不是文本而是二进制的。
bytelets
除了XML和我们在上面看到的P4D元素之外,Telets还用于处理 二进制数据以灵活的方式。
假设您想序列化一个字符串,而不想使用空终止符。 然后你必须把字符串的长度和字符串一起发送 接收方将hexcode标识为字符串的类型或tag。
elm bl:text: Tag: 0x50 Len: &LEN Text: "{obamania}"
这个p4d元素产生一个bytelet。BYTelets通常使用 bl命名空间前缀。LEN对象是所谓的Flow对象。它 是一种数据流绑定。如果将LEN绑定到字段,它将计算 后续字段所有值的长度之和。如果你更新BYTELET 将使用LEN重新计算“len”字段的值。
您可以查看此信息
assert text.Len.hex() == 8
这里8只是文本的长度。
new_text = text.clone() new_text.Text = "{the merkel}" assert new_text.Len.hex() == 10
我们可以完全计算textbytelet
assert text.hex() == 0x50 0x08 0x6F 0x62 0x61 0x6D 0x61 0x6E 0x69 0x61
请注意,写入0x50 0x08 0x6F ... `` without quotes is valid in P4D and it yields a ``Hex对象不是数字。所以p4d支持增强的十六进制 与Python获得不同语义的文字。
现在我们要将Hex对象转换回bytelet,它必须 被解析。这是由Schema
elm bl-schema:TextSchema: Tag: 1 Len: &LEN Text: &VAL parsed = TextSchema.parse(text.hex()) assert parsed.hex() == text.hex()
Schema的特征是名称空间前缀bl-schema。否则 它只是另一个带有parse()方法的bytelet。在这里模式有 与原始BYTELET结构完全相同,但字段值不同。这个 新值VAL也是数据流绑定。它绑定到Len字段。 在解析^{tt21}时将值0x08分配给Len之后$ 绑定使用此值从输入流中剪切8字节,然后 分配给文本。
BYTELETS的更多功能:
- BYTELETS的规格可以通过设置单个位来细化 以及指定位数组宽度。
- 模式可用于解析^{tt27}的任意序列$ 类似于我们示例中的结构。但是^{tt28}的顺序$ 不用修理。
- 简单的算法是为Flow对象定义的,比如LEN和VAL。 所以我们可以写Len : &LEN + 1也可以写Text: &VAL - VAL["IHL"]*4 其中VAL["IHL"]不是指Len,而是指另一个字段IHL。
有关详细信息,请查看P4D文档
http://www.fiber-space.de/EasyExtend/doc/p4d/p4d.html
http://www.fiber-space.de/EasyExtend/doc/p4d/bytelets.html