diff --git a/ml.cpp b/ml.cpp index b245321..1971cd9 100644 --- a/ml.cpp +++ b/ml.cpp @@ -1580,6 +1580,19 @@ MlValue tail(std::vector args, MlEnvironment &env) { return MlValue(result); } +MlValue second(std::vector args, MlEnvironment &env) { + eval_args(args, env); + + if (args.size() != 1) + throw MlError(MlValue("second", second), env, args.size() > 1 ? TOO_MANY_ARGS : TOO_FEW_ARGS); + + std::vector list = args[0].as_list(); + if (list.empty() || list.size() < 2) + throw MlError(MlValue("second", second), env, INDEX_OUT_OF_RANGE); + + return list[1]; +} + MlValue parse(std::vector args, MlEnvironment &env) { eval_args(args, env); @@ -1998,6 +2011,7 @@ MlValue MlEnvironment::get(const std::string &name) const { if (name == "head") return MlValue("head", builtin::head); if (name == "tail") return MlValue("tail", builtin::tail); if (name == "first") return MlValue("first", builtin::head); + if (name == "second") return MlValue("second", builtin::second); if (name == "last") return MlValue("last", builtin::pop); if (name == "range") return MlValue("range", builtin::range);