问题描述
json([ name='Demo term',created=json([day= @null,month='December',year=2007]),confirmed= @true,members=[1,2,3]
])
我正在看 swi prolog 手册,但不明白其中的语法 (https://linkedpolitics.project.cwi.nl/swish/pldoc/man?section=jsonsupport),而且我无法找出合适的搜索词。
这是什么意思? name='Demo term',
还有这个? [day= @null
还有这个? members=[1,3]
这些是一些特殊的语法还是只是奇怪的原子?
解决方法
这个语法真的没有什么特别之处:
json/1
是一个以列表为唯一参数的复合词。
该列表有条目
name='Demo term'
created=json([day= @null,month='December',year=2007])
confirmed= @true
members=[1,2,3]
显然试图模拟地图关键字 -> 值:
- 关键字
name
与原子“Demo term”相关联(使用单引号,因为它包含一个空格并以大写开头 - 关键字
created
与复杂的复合词json([day= @null,year=2007])
相关联 - 关键字
confirmed
与复合词@true
相关联,最好写成@(true)
。 - 关键字
member
与列表[1,3]
相关联
请注意 https://eu.swi-prolog.org/pldoc/man?section=jsonsupport
处的此说明JSON 常量 true 和 false 像 JPL 一样映射到 @(true) 和 @(false)。 JSON 常量 null 映射到 Prolog 术语 @(null)
虽然不得不写
X='@'(true).
所以也许这个例子是愚蠢的。
您可以在 SWI-Prolog 的命令行执行此操作以将术语打印在 规范模式(为可读性添加了换行符;我的观点是 write_canonical 也应该正确缩进,遗憾的是它没有缩进):
?- write_canonical(json([ name='Demo term',| created=json([day= '@'(null),year=2007]),| confirmed= '@'(true),| members=[1,3]
| ])).
json([=(name,'Demo term'),=(created,json(
[=(day,@(null)),=(month,'December'),=(year,2007)]
)
),=(confirmed,@(true)),=(members,[1,3])])
true.