- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 JavaScript 作为源语言来实现编程语言 LISP 的一小部分。当这个小 lisp 被喂食一个看起来像这样的字符串时:
(define func (lambda (args)(body)))
然后将其传递给名为 CreateLambda 的函数。例如,正在传递以下字符串:
(define add (lambda(x y)(+ x y)))
然后由该函数创建一个 Javascript 函数;
function createLambda(expr, env) { // lambda args body
expr.shift(); //remove the "lambda".
var lambdaArgs = expr.shift(); //get the arguments
var lambdaBody = expr.shift(); // get the body
var parentEnvironment = env;
return function() {
var lambdaEnvironment = new environment(parentEnvironment, "lambda environment");
for(var i = 0; i < arguments.length; i++) {
var tempVal = evaluate(arguments[i], parentEnvironment);
lambdaEnvironment.add(lambdaArgs[i], tempVal);
}
return evaluate(lambdaBody, lambdaEnvironment);
}
}
稍后,如果在 small lisp 中调用和评估此函数,则如下所示:
(add 2 3)
这个字符串在看起来像这样的情况下被评估循环拾取:
else if(typeof expr[0] === 'string') {
var lispFunc = env.get(expr[0]); //find the function in the environment.
expr.shift();
var lispFuncArgs = [];
var tempArg = expr.shift();
while(tempArg != null) { //apply the variables
lispFuncArgs.push(evaluate(tempArg, env));
tempArg = expr.shift();
}
return lispFunc.apply(this, lispFuncArgs);
第一次将它传递给评估函数时,它按预期工作并返回数字 5。
但是,如果再次调用同一个函数。它仅作为“未定义”进入评估循环。
完整的 HTML;
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Script-
Type" content="text/javascript">
<title>LISP in JavaScript</title>
<script type="text/javascript" src="lisp.js"></script>
</head>
<body>
<form id="repl" name="repl" action="parse(prompt.value)">
lisp==>
<input id="prompt" size="200" value="" name="prompt"
maxlength="512">
<br>
<input type=button style="width:60px;height:30px" name="btnEval"
value="eval" onclick="output(prompt.value)">
<br>
</form>
<div id="debugdiv" style="background-
color:orange;width=100px;height=20px">
</div>
</body>
</html>
完整的 JavaScript;
//functions for parsing input String
function parse(exp) {
return readFromTokes(tokenize(exp)); //code
}
function isNumeric(arg) {
return !isNaN(arg);
}
function readFromTokes(exp) {
//Create abstract syntax tree
if(exp.length == 0) {
}
var token = exp.shift();
if(token == '(') {
var L = [];
while(exp[0] != ')') {
L.push(readFromTokes(exp));
}
exp.shift(); //remove end paranthesis
return L;
} else {
if(token == ')') {
console.log("Unexpected )");
} else {
return atom(token);
}
}
}
function tokenize(exp) {
//Convert a program in form of a string into an array (list)
var re = /\(/g;
var re2 = /\)/g;
exp = exp.replace(re, " ( ");
exp = exp.replace(re2, " ) ");
exp = exp.replace(/\s+/g, ' ');
exp = exp.trim().split(" ");
return exp;
}
function atom(exp){
if(isNumeric(exp)) {
return parseInt(exp); //A number is a number
} else {
return exp; //Everything else is a symbol
}
}
function environment(parentEnvironment, name) {
var bindings = [];
var parent = parentEnvironment;
var name = name;
function add(variable, value) {
console.log("variable: " + variable + " value: " + value);
bindings.push([variable, value]);
}
function printName() {
console.log(name);
}
function print() {
console.log("printing environment: ")
for(var i = 0; i < bindings.length; i++) {
console.log(bindings[i][0] + " " + bindings[i][1]);
}
}
function get(variable) {
for(var i = 0; i < bindings.length; i++) {
if(variable == bindings[i][0]) {
return bindings[i][1];
}
}
if(parent != null) {
return parent.get(variable);
} else {
console.log("No such variable");
}
}
function getParent(){
return parent;
}
this.add = add;
this.get = get;
this.getParent = getParent;
this.print = print;
this.printName = printName;
return this;
}
function addPrimitives(env) {
env.add("+", function() {
var s = 0;
for(var i = 0; i < arguments.length; i++) {
s += arguments[i];
}
return s
});
env.add("-", function() {
var s = arguments[0];
for(var i = 1; i < arguments.length; i++) {
s -= arguments[i];
}
return s
});
env.add("*", function() {
var s = 1;
for(var i = 0; i < arguments.length; i++){
s *= arguments[i];
}
return s
});
env.add("/", function(x, y) { return x / y });
}
function createLambda(expr, env) { // lambda args body
expr.shift(); //remove the "lambda".
var lambdaArgs = expr.shift(); //get the arguments
var lambdaBody = expr.shift(); // get the body
var parentEnvironment = env;
return function() {
var lambdaEnvironment = new environment(parentEnvironment, "lambda
environment");
for(var i = 0; i < arguments.length; i++) {
var tempVal = evaluate(arguments[i], parentEnvironment);
lambdaEnvironment.add(lambdaArgs[i], tempVal);
}
return evaluate(lambdaBody, lambdaEnvironment);
}
}
function evaluate(expr, env) {
console.log(expr + " has entered evaluate loop");
env.printName();
env.print();
if(typeof expr === 'string') {
console.log(expr + " is a symbol");
return env.get(expr);
} else if(typeof expr === 'number') {
console.log(expr + " is a number");
return expr;
} else if(expr[0] === 'define') { // (define var value)
console.log(expr + " is a define statement");
expr.shift();
var newVar = expr.shift();
var newVal = evaluate(expr.shift(), env);
env.add(newVar, newVal);
return env;
} else if (expr[0] === 'lambda') { // (lambda args body)
console.log(expr + " is a lambda statement");
return createLambda(expr, env);
} else if (typeof expr[0] === 'string'){
var lispFunc = env.get(expr[0]);
expr.shift();
var lispFuncArgs = [];
var tempArg = expr.shift();
while(tempArg != null) {
lispFuncArgs.push(evaluate(tempArg, env));
tempArg = expr.shift();
}
console.log("Function: " + lispFunc);
console.log("Arguments: " + lispFuncArgs);
return lispFunc.apply(this, lispFuncArgs);
} else {
console.log(expr + " cannot be interpreted");
}
}
var globalEnvironment = new environment(null, "Global");
addPrimitives(globalEnvironment);
function start(string) {
return evaluate(parse(string), globalEnvironment);
}
var output = function (string) {
try {
document.getElementById('debugdiv').innerHTML = start(string);
} catch(e) {
document.getElementById('debugdiv').innerHTML = e.name + ': ' + e.message;
}
};
最佳答案
这是因为您的代码中存在一个小错误。当您在第 134 行调用 evaluate(lambdaBody, lambdaEnvironment)
时,您提供 lambdaBody
作为第一个参数,即 expr
参数'function evaluate(expr, env)' 函数(第 138 行)。在评估期间,您使用 tempArg = expr.shift();
函数使用它,并在它为空时退出循环。不幸的是,您的 lambdaBody
第二次是一个空数组。
要修复它,您应该更改求值函数而不是修改它的参数(例如,创建一个副本并使用该副本)
我建议您修复评估函数中的错误,但真正有效的示例是将第 134 行更改为深度复制 lambdaBody
,如下所示:
evaluate(lambdaBody.slice(0), lambdaEnvironment);
无论调用多少次,您都会发现它现在可以正常工作。但该错误实际上在评估函数内部,因此请在那里修复它。
关于Javascript 函数消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47778271/
我使用 vanilla JS 通过 AJAX 向数据库发送请求。数据写入数据库没有问题。在刷新页面之前,我看不到被放入数据库中的内容。当我删除内容时也会发生同样的情况,我必须刷新才能看到内容消失了。
抱歉,这篇文章很长,我试图提供所有信息并解释我已经尝试过的内容。 问题: 我将经典的 Phoenix View 放入实时 View 中。虽然一切看起来都很好,但 echart 一完成绘制就消失了。好像
搜索了一下,没有找到我要找的东西。我有两个按钮,单击一次即可拉出两个不同的选择框,第二次单击它们就会消失。但是,我希望选择框 1 在单击按钮 2 时消失,反之亦然:选择框 2 将在单击按钮 1 时消失
我正在尝试使用自动布局使用“浮动”标题构建滚动视图。更确切地说,我正在尝试建立包含几列的日历视图。这些列中的每个列都应具有自己的标题,该标题应浮动在顶部,而该列可以垂直滚动到其下方。 如果一切正常,则
我正在尝试模仿星星背景。 星星是在加载时创建并随机散布在整个网站上的。到目前为止我已经调整了一些代码。 var star="•"; var numStars=100; for(var x=1;x•";
我查遍了整个网络,但找不到解决方案。我对 jQuery 也很陌生。 我的案例: 我有一个导航栏,其中的每个链接都会激活/触发一个megamenu(每个链接都有自己的megamenu)。 我需要什么:
我有一个可扩展的 ListView ,当我点击一行时,它会触发 onChildClick 或 onGroupClick,具体取决于我点击的是子项还是组。 如果我在 xml 布局文件中添加可点击的内容(
在我的程序中,我有一个 NSMutableData 变量,用于收集来自 http://www.nhara.org/scored_races-2013.htm 的信息。 .大约第三次从网站获取信息后,当
我一直在完美地使用 Genymotion,但是从最近几天开始我的 Genymotion 并打开它的 GPS 开始,我的 Genymotion 突然消失了。但是我的 eclipse 显示 Genymot
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and t
所以我的 Item::return_all() 有问题,因为我在 main.cpp 中调用它。早些时候我在 read_file() 和 for (auto data : example_item) 中
所有 UITableCells 在 UITableView 中滚动和触摸时消失。一切都以编程方式完成,我使用标准的 UITableViewCell 类。 我在某处读到包含我的单元格数据的数组可能被清空
我对 Swift 还很陌生。我的问题是我的 UICollectionView 正在消失。在 Xcode 中,它显示一切就绪,但当我在模拟器或设备上启动时,它消失了,只剩下导航栏和标签栏。 有谁知道是什
这是 this one的续题。较早的问题是在复选框上。但是后来我根据要求把check box改成了radio buttons。 现在我需要显示子单选按钮并在母单选按钮处于事件状态时更改背景颜色。一旦它
我用 JS 写了一个简单的脚本。当我将它放入 html 文档(在 body 标签的底部)时,它工作正常。当我尝试将它放入外部文档并链接它时,脚本运行但 canvas 元素消失(刚刚检查:当我将脚本放在
我正在尝试创建一个带有固定元素的滚动页面,当用户向下滚动页面时,该元素“始终”可见。例如,带有道路背景的汽车图像。因此,当用户向下滚动页面时,汽车看起来就像在路上行驶。虽然汽车出现在道路的顶部,但它必
这个问题在这里已经有了答案: How can I change CSS display none or block property using jQuery? (15 个答案) 关闭 4 年前。
我在市场上有一个支持小部件的应用程序。我对应用程序进行了一些重大更改,重新设计了很多内部结构,替换/重命名 Activity 等。其他更改包括从不同的共享首选项键获取小部件配置数据,尽管我已经编写了转
我有一个 fragment alertsfragment.java,它有一个 GridView 布局,当我打开它时,它工作正常,但是当我在其他选项卡之间滑动时,它就消失了。为了解释更多,我有一个 Ac
我是一名优秀的程序员,十分优秀!