回想一下,K组合器是一个常数函数.它总是返回它的第一个参数:
Kxy = x for all y
Run Code Online (Sandbox Code Playgroud)
在To Mock a Mockingbird这本书中,作者提供了一个含有说话鸟类的魔法森林的例子.这些鸟有行为:
鉴于任何鸟类A和B,如果您将B的名称称为A,那么A将通过向您呼叫某只鸟的名称来回应:这只鸟我们将由AB指定.
假设森林由三只鸟A,B和C组成.至少有一只鸟可能像K组合一样吗?
下面的表格显示了魔法森林中鸟类的一组可能行为.第一列包含森林中每只鸟的名称.顶行的名称可以调用每只鸟.身体是鸟对名字的反应.例如,如果您将A的名称称为鸟A,则鸟A将以C响应(请参阅第2行第2列).简洁地说,AA = C.如果你把B的名字叫做鸟A,那么鸟A会回答B(见第2行,第3栏).简洁地说,AB = B. AC的空槽应该有什么值?
| A B C
------------------
A | C B
B | B B B
C | A A A
Run Code Online (Sandbox Code Playgroud)
让我们看看我们是否可以让鸟A表现得像K组合器.上面的一组值看起来很有希望:
对于所有y,AA = C且Cy = A. 也就是说,对于所有y,(AA)y = A.
对于所有y,AB = B且By = B. 也就是说,对于所有y,(AB)y = B.
空槽(AC)应该放置什么值?考虑所有情况:
如果AC = A则所有y的Ay值必须为C,这显然是错误的.因此,A不能是空槽的正确值.
如果AC = B则所有y的By值必须为C,这显然是假的.因此,B不能是空槽的正确值.
如果AC = C则所有y的Cy值必须为C,这显然是假的.因此,C不能是空槽的正确值.
因此,对于每个y,不能在空槽中放置值以满足条件(AC)y = C.
据我所知,不可能让任何一只鸟表现得像K组合器.我希望你能证明我错了.
lambda functional-programming combinators function-composition k-combinator
一些编程问题不需要图灵机的全部功能来解决.它们可以用更少的功率解决.我正在寻找功能较弱的编程语言.
是否存在仅限于支持这些功能的高级编程语言:
具有将值推入堆栈并将值从堆栈中弹出的操作的堆栈.
有限状态机(FSM)用于输入值,从状态移动到状态,与堆栈交互以及输出结果.
我意识到我可以使用Java或C或Python(等)并通过编写仅使用堆栈和FSM的程序来约束语言.但是,我正在寻找一种只具备这些功能的编程语言,而不是更多.
换句话说,我不想使用图灵完整的编程语言来解决只需要确定性下推自动机功能的问题.我想使用只具有确定性下推自动机功能的编程语言.
stack deterministic state-machine turing-complete pushdown-automaton
该import语句或tokenVocab选项可以放在一个解析器语法重用词法语法.
Sam Harwell建议总是使用tokenVocab而不是import[1].
有什么区别import和tokenVocab?如果没有区别(Sam说要使用tokenVocab),为什么要import声明呢?
[1]我实际上建议在ANTLR中完全避免使用import语句.请改用tokenVocab功能.[山姆哈威尔]
我有一个简单的HelloWorld.g4语法(见底部)。我能够.py使用这个成功生成文件:
set CLASSPATH=.;antlr-complete.jar;%CLASSPATH%
java org.antlr.v4.Tool -Dlanguage=Python2 HelloWorld.g4
Run Code Online (Sandbox Code Playgroud)
现在我想使用TestRig带有-gui标志的来生成解析树 GUI。我已经安装了 ANTRL Python 运行时 ( antlr4-python2-runtime-4.5.tar.gz)。我可以打开一个 Python 解释器并输入:
import antlr4
Run Code Online (Sandbox Code Playgroud)
并且解释器识别antlr4模块。
当我TestRig像这样运行时:
set CLASSPATH=.;antlr-complete.jar;%CLASSPATH%
java org.antlr.v4.gui.TestRig HelloWorld message -gui < input.txt
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Can't load HelloWorld as lexer or parser
Run Code Online (Sandbox Code Playgroud)
从我的调查中,我发现有几篇文章列出了相同的错误消息。但是,在这些情况下,他们忘记在类路径中包含句点 (.)。但是正如您所看到的,我已将它包含在我的类路径中。
我对如何TestRig开始工作没有想法。注意:当目标语言是 Java 时TestRig,使用相同的HelloWorld语法没有问题。
您能提供的任何帮助将不胜感激。
你好世界.g4
grammar HelloWorld;
options { language=Python; }
message : GREETING NAME;
GREETING : 'Hello' ;
NAME : [a-zA-Z]+ …Run Code Online (Sandbox Code Playgroud) 有没有办法在 ANTLR4 中表达这一点:
任何不包含星号后紧跟正斜杠的字符串?
这不起作用:(~'*/')*因为 ANTRL 引发此错误:multi-character literals are not allowed in lexer sets: '*/'
这有效但不正确:(~[*/])*因为它禁止包含单个字符*或/.
我正在将一些Scheme代码转换为Common Lisp.我不知道Scheme.我知道一点Common Lisp.
这是Scheme代码:
(define (with-process-abortion thunk)
(call-with-current-continuation
(lambda (k)
(fluid-let ((*abort-process* k))
(thunk)))))
Run Code Online (Sandbox Code Playgroud)
我对Scheme call-with-current-continuation函数做了一些阅读,但老实说,我不知道上面的函数是做什么的.我此时转换为Common Lisp是非常骨架的:
(defun with-process-abortion (thunk)
;; No idea how to implement
)
Run Code Online (Sandbox Code Playgroud)
这篇SO帖子说:
每次出现的call/cc都可以替换为以下等价物:
(lambda(fk)(f(lambda(v k0)(kv))k))
其中k是要保存的连续符,并且(lambda(v k0)(kv))是恢复此连续的转义过程(在被调用时被激活的任何连续符k0被丢弃).
好的,f在我的情况下会有什么对应的?什么会k对应?
Common Lisp的成语是什么:
删除列表中不满足谓词的元素以及满足谓词的元素应用函数.
这是Common Lisp的成语:
mapcar applied to remove-if
Run Code Online (Sandbox Code Playgroud) 我正在将一些Scheme代码转换为Common Lisp.我不知道Scheme.我知道一点Common Lisp.
这是Scheme代码:
(define (close-enuf? h1 h2 #!optional tolerance scale)
(if (default-object? tolerance)
...))
Run Code Online (Sandbox Code Playgroud)
我将该Scheme代码转换为此Common Lisp:
(defun close-enuf? (h1 h2 &optional tolerance scale)
(if (xxx tolerance)
...))
Run Code Online (Sandbox Code Playgroud)
除此之外xxx,这看起来不错吗?
现在,关于xxx什么是Common Lisp等价物default-object?
我找到了这个定义default-object?:
The predicate default-object?, which is true only of default objects, can be used to determine which optional parameters were supplied, and which were defaulted.
Run Code Online (Sandbox Code Playgroud)
我不确定那是什么意思.是否说default-object?如果参数的值是默认值(不是传入的值),则返回true?
测试#1
我有一个全局声明的变量f,以及一个名为的参数的函数f:
(defvar f 1)
(defun test (f)
f)
Run Code Online (Sandbox Code Playgroud)
我调用该函数,它返回参数的值:
(test 2)
=> 2
Run Code Online (Sandbox Code Playgroud)
测试#2
我再次有一个全局声明的变量f,以及一个名为参数的函数f.但是,这次函数返回a lambda,返回f:
(defvar f 1)
(defun test (f)
#'(lambda ()
f))
Run Code Online (Sandbox Code Playgroud)
我调用该函数并返回该lambda函数.然后我调用lambda函数,它返回全局值f:
(funcall (test 2))
=> 1
Run Code Online (Sandbox Code Playgroud)
我很惊讶.我认为该lambda函数是一个闭包,并将返回本地f,而不是全局f.如何修改test函数和/或lambda函数以使lambda函数返回本地函数而f不是全局函数f?
将讨论指向讨论此特定范围问题的在线资源的指针.
我开始学习Alloy并且非常喜欢我所见过的.
在鼓励我的同事和我一起学习和使用Alloy之前,我需要了解Alloy和UML之间的关系.
一般来说,任何你能告诉我关于Alloy和UML之间关系(或缺乏关系)的信息都会非常感激.
谢谢.