这是我的问题:我想创建一个记录类型,其中在变体记录的情况下,一些(但不是全部)将具有某个字段.根据维基,这是完全合法的.然而,当我尝试编译以下代码时:
program example;
{$mode objfpc}{$H+}
uses sysutils;
type
maritalStates = (single, married, widowed, divorced);
TPerson = record
name: record
first, middle, last: string;
end;
sex: (male, female);
dob: TDateTime;
case maritalStatus: maritalStates of
single: ( );
married, widowed: (marriageDate: TDateTime);
divorced: (marriageDate, divorceDate: TDateTime;
isFirstDivorce: boolean)
end;
var
ExPerson: TPerson;
begin
ExPerson.name.first := 'John';
ExPerson.name.middle := 'Bob';
ExPerson.name.last := 'Smith';
ExPerson.sex := male;
ExPerson.dob := StrToDate('05/05/1990');
ExPerson.maritalStatus := married;
ExPerson.marriageDate := StrToDate('04/01/2015');
end.
Run Code Online (Sandbox Code Playgroud)
编译失败,出现以下错误:
$ fpc ex.pas
Free …Run Code Online (Sandbox Code Playgroud) 有一个单独的目录来存储目标文件是有用的.但是,gprbuild如果该目录尚不存在,则会抱怨.我hg用于版本控制,它不允许你跟踪空目录(AFAIK也是如此git),但即使它确实如此,不幸的是必须用空目录来混淆存储库.gprbuild有一个选项,--create-missing-dirs(简短形式-p),它完全符合它在锡上的说法.这非常有用.但是,我想知道的是,是否有某种方法可以在.gpr文件中设置它.提醒我的用户使用该-p选项进行编译是令人讨厌的,而不是只能运行gprbuild project.不幸的是,这些文档gprguild有这样的说法:
默认情况下,GPRbuild检查项目文件中指定的对象,库和exec目录是否存在.Switch
-p指示GPRbuild尝试创建丢失的目录.请注意,这些开关可以在主项目的包Builder中指定,但它们在那里是无用的,因为在评估Builder切换之前,目录已经存在或项目文件的处理失败,因为至少有一个缺失目录.
当然必须有办法做我所描述的事情?
假设我想编写一个自定义运算符来组合DCG规则,否则将会重复.
例如,假设我有一个DCG,ws这样:
ws --> [].
ws --> " ", ws.
Run Code Online (Sandbox Code Playgroud)
匹配零个或多个空格.显然,如果我想在我的语法中的每个标记之间有可选的空格,那么必须放在, ws任何地方都是令人讨厌的.
我可以定义一个新的运算符来替换,/2.
:- op(1000, xfy, [ -- ]).
:- meta_predicate --(*,*,?,?).
--(L,R) --> ({callable(L)} -> call(L); L), ws, ({callable(R)} -> call(R); R).
Run Code Online (Sandbox Code Playgroud)
这--/2通过可选的空格规则加入左手和右手.这大多数工作正常,但有些事情绊倒了:
rule --> "foo" -- ("bar"; "quux").
Run Code Online (Sandbox Code Playgroud)
如果我尝试执行此规则,则会收到错误消息,说明;/4未定义.我对这个问题有一个模糊的概念,但基本上问题是:有没有办法为DCG定义具有相同通用性的新运算符,/2?
对于我的 Jekyll 网站,我在每个页面上生成 BibTeX 代码,以使其更易于引用。目前,我的模板如下所示:
<code>
% BibTeX Code
% Copy and paste the following code into your .bib file to cite this article:
@online{
title="{{ page.title | escape }}",
author="{{ page.author | escape }}",
organization="{{ site.title | escape }}",
date="{{ page.date | date: "%Y-%m-%d" }}",
urldate="{{ site.time | date: "%Y-%m-%d" }}",
url="<!-- website domain name here -->{{page.url}}"
}
</code>
Run Code Online (Sandbox Code Playgroud)
只有一个问题:对于那些了解 BibTeX 的人来说,我缺少一个条目名称。在我的代码中显示的位置之后@online{,我需要一个条目名称,用于引用 BibTeX 数据库中的条目。现在,对此有一定的限制,例如它不能包含空格。事实上,Jekyll 生成的 HTML 文件的名称就很完美了。然而,我不清楚如何获得这个名字。液体模板{{page.url}}会生成类似的东西/2017/02/22/my-page.html,但我想要的只是my-page.
我使用 Lua 作为我的项目的配置格式。假设我有以下人为示例,我们将调用conf.lua:
title = "Lorem Ipsum"
author = "John Doe"
date = "01 January 2000"
Run Code Online (Sandbox Code Playgroud)
现在,很简单,我当然可以像这样加载这个文件:
dofile("conf.lua")
Run Code Online (Sandbox Code Playgroud)
但是,问题在于这些定义是在全局命名空间中设置的,这是我不想要的。此外,这使得访问不同的变量作为一个整体变得困难(例如循环配置变量集)。一种解决方案是conf.lua像这样重写:
local conf = {
title = "Lorem Ipsum",
author = "John Doe",
date = "01 January 2000"
}
return conf
Run Code Online (Sandbox Code Playgroud)
依次加载conf.lua以下代码:
local configuration = dofile("conf.lua")
Run Code Online (Sandbox Code Playgroud)
但是,由于我认为显而易见的原因,这并不理想。它要求我的用户跟踪逗号,必须写local,必须记住在最后返回表。如果有某种方法可以conf.lua使用某种自定义范围来执行,那将会是一件好事。