如果你想找一份软件女巫的工作,你必须通过白板面试。作为工程师,我们都会这样做-通常是作为我们早上例行公事的一部分,同时在星体平面上安排一个漂亮的xterm网格,并在附近的每个目录中强制运行l-以防事情在夜间发生变化-这是一种无形的相当于在厨房后面的抽屉里翻找,我们在那里存放着奇怪的法兰、螺丝刀和奇怪的具体塑料件:配件,我们家用电器家族中那些疏远已久的害群之马,它们的最初用途现在已经被遗忘,也许永远不知道,但我们仍然必须照顾它们。我想向您介绍一个常见的面试问题:颠倒链表。
首先,我们需要一个链表。清除工作区中不需要的xterm,在由两个括号组成的保护性形式中撒盐,然后递归。从空虚中召唤一份名单。
(defn cons[h t]#(if%h t))“这不是名单,”面试官说。“这是一句如果的话。”
“名单还有什么,”你回答道,眼睛闪着光芒,“但有其他选择吗?”
User=>;(def x(cons 1(Cons 2 Nil)#';user/x user=>;(X True)1 user=>;((X False)true)2“x到底是什么?”面试官尽一切努力表现得友好。在代表处回答,但千万不要上当受骗。他们不是朋友。你在前台的誓言是禁止的。
User=>;x#object[user$cons$cell__4431 0 x3b89cc1c";user$cons$cell__4431@3b89cc1c";]“知道一件事就是给它命名,”您建议。真名有力量。K语言是由Ursula K.Le Guin发明的,是最古老和最简洁的魔术形式之一。在一门语言中灌输你自己名字的字母,就是放弃了你自己的一个元素。你自己名字的首字母会因为记忆而疼痛。
“嗯,好的,那么你怎么从这个列表中取出一个元素呢?”
你脑海中的表情是美丽的,就像赤脚下的红地毯一样展开。昨晚举行了奥斯卡颁奖典礼,但你渴望不同星星在你裸露的皮肤上亲吻,就像你住在索利亚的山区,把月亮称为你的情人一样。除了边界检查,你第一次就做对了。
(defn nth[l n](当l(if(=0n)(L True)(recur(L False)(Dec N)“你能不能给我看一个常规的列表?就像在Python里一样?“。
你咬紧牙关,把脚贴在地板上,从空隙中挖出一台漂亮的打印机。你的手掌现在长满了老茧,你的眼皮上布满了晶莹剔透的、烟灰黑色的雪花。每项操作都是有成本的--当然,纯功能除外,因为它没有副作用。
(defn prn-list[l](print";(";)(loop[l])(if(nil?L)(print";)\n";)(do(print(L True))(When(L False)(print";";))(recur(L False)这里没有时间处理描述性变量、示例或文档字符串。在白板面试中,时间至关重要。假装你是一名Haskell程序员,就像你的祖母在她的延续通过之前一样。
User=>;(prn-list(cons 1(cons 2(Cons 3 Nil)(1 2 3)面试者微笑,放心了。我们是在,或者至少在熟悉的基础上。“所以,要逆转它,你可以…”
你把他的手握在你的手中,他的头脑疯狂地解开发条,跳动的条虫解体,扑通的心跳着,错落有致,用古老的语言背诵着一句警句。
(defn Reverse[l](loop[r nil,l l](if l(recur(cons(L True)r)(L False))r)user=>;(prn-list(Reverse(cons 1(cons 2(Cons 3 Nil)(32 1)当您松开手中的手时,他会结结巴巴地说些有礼貌的话,并拉开帽衫的拉链以防止霜冻。还会有其他会议,但你不需要参加。派一只老鹰来代替你。
当然,他们会拒绝,而且会感到羞愧,理由是缺乏文化契合度。落在你的云松上,从窗户出去。这地方永远容不下你。