我正在尝试从头启动C(的子集),而不使用额外的依赖项(解析器生成器,库等)。我也想利用解析器组合器的思想,这在函数式编程中是一种很棒的技术。我想以一种简洁实用的方式将这种想法从功能世界借鉴到过程C中。
我尝试为以下玩具语法实现一些必要的解析器组合器,这也是Simon Peyton Jones 的《实现功能语言-教程》一书中的示例。
greeting -> hg person "!"
hg -> "hello"
| "goodbye"
Run Code Online (Sandbox Code Playgroud)
person
以字母开头的令牌在哪里?例如,令牌列表
["goodbye", "James", "!"]
Run Code Online (Sandbox Code Playgroud)
被解析为
[(("goodbye", "James"), ["!"])]
Run Code Online (Sandbox Code Playgroud)
(这本书使用了Haskell,很难使它与语言无关,但是您会明白的:-)
我用C语言实现了这一点,您可以在这里查看代码:https : //gist.github.com/4451478
此实现花费200多行C代码,远远超过本书中编写的约20行Haskell。因此,我不确定我是否在使用C进行解析器组合器方面是否正确,以及是否有任何可能的改进。任何建议都欢迎。提前致谢。
我正在使用2 x四核Xeon E5520 2.2GHz,24.0GB RAM和Erlang R15B02(启用SMP)的节点上运行实验.我想知道是否可以限制Erlang VM使用的内核数量,以便我可以暂时禁用某些内核并逐步增加数量以测试可伸缩性.
我在此节点上没有root访问权限.所以我期待一些方法,可以通过向erl
Erlang代码指定参数或通过Erlang代码指定参数.
我正在为MediaWiki 编写自己的AuthPlugin,并参考正式提供的文档和代码.有关域的几个功能:
AuthPlugin::domainList()
// Get a list of domains (in HTMLForm options format) used.
AuthPlugin::getDomain()
// Get the user's domain.
AuthPlugin::setDomain($domain)
// Set the domain this plugin is supposed to use when authenticating.
Run Code Online (Sandbox Code Playgroud)
但是,我不明白什么是域名,应该怎么样?这是AuthPlugin扩展的编写者想要的,而不是在默认的MW配置中有任何意义吗?
根据http://tldp.org/LDP/abs/html/quotingvar.html
使用双引号来防止分词.用双引号括起来的参数将自身表示为单个单词,即使它包含空格分隔符.
但是,我有
0> /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
[...]
1> cat inspect.sh
#!/bin/bash
echo "first argument is $1"
echo "second argument is $2"
2> cat test.sh
#!/bin/bash
set -x
./inspect.sh "hello $@"
3> ./test.sh alice bob
+ ./inspect.sh 'hello alice' bob
first argument is hello alice
second argument is bob
4> ./test.sh "alice bob"
+ ./inspect.sh 'hello alice bob'
first argument is hello alice bob
second argument is
Run Code Online (Sandbox Code Playgroud)
我想知道为什么3>和4>有不同的结果?如何修改test.sh让3>具有与4>相同的输出?
我正在使用spawn_link
但不了解其行为.请考虑以下代码:
-module(test).
-export([try_spawn_link/0]).
try_spawn_link() ->
spawn(fun() ->
io:format("parent: ~p~n", [Parent = self()]),
Client = spawn_link(fun() ->
io:format("child: ~p~n", [self()]),
spawn_link_loop(Parent)
end),
spawn_link_loop(Client)
end).
spawn_link_loop(Peer) ->
receive
quit ->
exit(normal);
Any ->
io:format("~p receives ~p~n", [self(), Any])
end,
spawn_link_loop(Peer).
Run Code Online (Sandbox Code Playgroud)
从Erlang文档中,原子地在调用进程和新进程之间创建一个链接.但是,我测试如下,并没有注意到链接的影响.
1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true
4> pid(0,35,0) ! quit.
quit
5> is_process_alive(pid(0,35,0)).
false
6> is_process_alive(pid(0,34,0)).
true
1> test:try_spawn_link().
parent: <0.34.0>
<0.34.0>
child: <0.35.0>
2> is_process_alive(pid(0,34,0)).
true
3> is_process_alive(pid(0,35,0)).
true …
Run Code Online (Sandbox Code Playgroud) 我想尝试Haskell type
并data
使用以下代码
type Program a = Maybe a -> (Operation a, Maybe Program a)
data Operation a = Read a | Write a
Run Code Online (Sandbox Code Playgroud)
Program
遵循延续传递方式(CPS)并Nothing
指示终止.a
可以用Int
其他东西实例化.
然而,GHC抱怨说:
main.hs:1:1:
Cycle in type synonym declarations:
main.hs:1:1-58: type Program a =
Maybe a -> (Operation a, Maybe Program a)
Run Code Online (Sandbox Code Playgroud)
我是Haskell的新手,所以我不明白为什么不允许这样做.如何在Haskell中表达这种类型?
我在Haskell中建模循环调度程序.
class Schedulable s where
isFinal :: s -> Bool
class Scheduler s where
add :: (Schedulable a) => a -> s -> s
next :: (Schedulable a) => s -> (a, s)
empty :: s -> Bool
data Schedulable a => RoundRobin = RoundRobin [a] [a]
instance Scheduler RoundRobin where
add p (RoundRobin ps qs) = RoundRobin (ps ++ [p]) qs
next (RoundRobin [] qs) = next (RoundRobin qs [])
next (RoundRobin (p:ps) qs) = (p, RoundRobin ps (qs …
Run Code Online (Sandbox Code Playgroud)