// ============================================================ // Monkey 案例 2:数组、哈希、内置高阶函数 // // 下面的命令假设当前在仓库根目录。已经 cd 到 posts/monkey 时, // 把路径里的 posts/monkey/ 去掉即可。 // // 运行: // monkey posts/monkey/case_collection.txt // // 把输出交给伪 bash 的管道和重定向: // monkey posts/monkey/case_collection.txt | wc -l // monkey posts/monkey/case_collection.txt | grep 385 // monkey posts/monkey/case_collection.txt > report.txt // cat report.txt // // `>` 写的是你自己的虚拟视图,不会写服务器磁盘。 // ============================================================ let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; let square = fn(x) { x * x }; puts("squares:"); puts(map(numbers, square)); puts("count:"); puts(len(numbers)); puts("sum:"); puts(sum(numbers)); puts("square sum:"); puts(sum(map(numbers, square))); puts("last:"); puts(last(numbers)); // 哈希用字符串键保存一小块“记录”: let monkey = {"name": "Monkey", "year": 2016}; puts("name:"); puts(monkey["name"]); puts("year:"); puts(monkey["year"]); // 用递归把数组分成偶数和奇数,结果仍然放进哈希: let isEven = fn(n) { n / 2 * 2 == n }; let split = fn(arr, evens, odds) { if (len(arr) == 0) { {"even": evens, "odd": odds} } else { let x = first(arr); if (isEven(x)) { split(rest(arr), push(evens, x), odds) } else { split(rest(arr), evens, push(odds, x)) } } }; let parts = split(numbers, [], []); puts("evens:"); puts(parts["even"]); puts("odds:"); // 最后一个表达式的值 parts["odd"]