Clojure doesn't provide direct support for named arguments, which are supported under some popular dynamic languages like Ruby, Python. The following Python code was exerpted from `The Joy of Clojure':
def slope(p1=(0,0), p2=(1,1)):
return (float(p2[1] - p1[1])) / (p2[0] - p1[0])
slope((4,15), (3,21))
#=> -6.0
slope(p2=(2,1))
#=> 0.5
slope()
#=> 1.0
It calculates the slope of a line, which can be determined by two given points. The following Clojure code mimics the named arguments:
(defn slope
([] (slope [0 0] [1 1]))
([{:keys [p1 p2] :or {p1 [0 0] p2 [1 1]}}] (slope p1 p2))
([p1 p2]
(/ (- (float (p2 1)) (p1 1)) (- (p2 0) (p1 0)))))
(slope [4 15] [3 21])
;=> -6.0
(slope {:p2 [2 1]})
;=> 0.5
(slope)
;=> 1.0
I think it's sufficient for most of the cases. However, if you want to go deeper, let's use the defnk from clojure.contrib.def.
-------------------------
clojure.contrib.def/defnk
([fn-name & fn-tail])
Macro
Define a function accepting keyword arguments. Symbols up to the first
keyword in the parameter list are taken as positional arguments. Then
an alternating sequence of keywords and defaults values is expected. The
values of the keyword arguments are available in the function body by
virtue of the symbol corresponding to the keyword (cf. :keys destructuring).
defnk accepts an optional docstring as well as an optional metadata map.
Unfornately, no examples were given in the doc string. Here's a simple example:
(require '[clojure.contrib.def :as def])
(def/defnk t [a :b 1] [a b])
(t 3)
;=> [3 1]
(t 3 :b 4)
;=> [3 4]
It should be noted that, the optional/named arguments must be put at the tail of the argument list. i.e. You can't write this: (def/defnk t [a :b 1 c] [a b c]) If you do, weird thing would happen. Or, your function may not even compile.
(def/defnk t [a :b 1 c] [a b c])
(t 1 2 3)
;=> [1 1 nil]
(def/defnk t [a :b 1 c d] [a b c d])
;=> java.lang.Exception: Unable to resolve symbol: d in this context
分享到:
相关推荐
《端到端设计在系统架构中的应用》一文由J.H. Saltzer、D.P. Reed和D.D. Clark撰写,出自麻省理工学院计算机科学实验室。本文旨在探讨分布式计算机系统中功能模块放置的设计原则,重点阐述了一种被称为“端到端”...
### 端到端论证在系统设计中的应用 #### 引言 《端到端论证在系统设计中的应用》是J.H. Saltzer、D.P. Reed和D.D....该论文主要探讨了如何在分布式计算机系统的模块之间合理分配功能的问题,并提出了一种称为“端到端...
### End-to-End Arguments in System Design #### 概述 《End-to-End Arguments in System Design》是一篇经典的网络组成原理论文,它提出了一个重要的设计理念——端到端设计原则(End-to-End Principle)。该...
在论文《Finding, Scoring and Explaining Arguments in Bayesian Networks》中,Jaime Sevilla提出了一种新的解释贝叶斯网络的方法,其主要贡献在于定义了概率论据的概念,并在此基础上设计了有效的算法,用以发现...
在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,特别是在处理函数参数时。它不是一个真正的数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径。无论函数定义了多少个形式参数...
### JavaScript中的`arguments`对象详解 在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这...
"arguments-extended"就是一个这样的开源库,专为处理JavaScript中的`arguments`对象提供了一系列实用方法,旨在增强参数操作的灵活性和便利性。 `arguments`对象在JavaScript中是一个特殊的对象,它在函数内部可用...
AIX64位操作系统服务器,Java6_64.sdk.tar,weblogic10介质,apache-http服务器 承载实例 服务器状态90 apache:133.0.175.90:8080 AIX5.3操作系统,jdk1.6,rpm环境 Adm ...
理解Javascript函数形式参数与arguments 在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确...
write a Java program called InputParms.java that accepts 3 arguments in the main method using an array. Iterate through the array looking for your name using a for loop. Display the message "The name ...
Rethinking the design of the Internet:The end to... Clark, M.I.T. Lab for Computer Science 这是Clark后来反思端到端论点的论文,此前他写过关于端到端论点的一篇经典论文:End to End arguments in System Design
twostar(1, 2, 3) # TypeError: twostar() takes 0 positional arguments but 3 were given ``` #### 四、综合应用 Python 允许在同一函数定义中同时使用这三种参数类型。这样可以创建功能更强大的函数,能够灵活...
《A Rulebook for Arguments》(《论证的规则手册》)是由Anthony Weston所著的关于逻辑论证、辩论和批判性思维的指南书籍,此书自1987年首次出版以来,一直广受好评,并已更新至第三版。本书不仅适用于学术界,同样...
在JavaScript编程语言中,函数是核心的组成部分,而`Arguments`对象则是JavaScript函数的一个独特特性。这个对象在函数调用时被自动创建,用于存储所有传递给函数的实际参数,无论这些参数是否在函数声明中定义。`...
Arguments对象是JavaScript中一个特殊的数据结构,主要用于在函数内部存储传递给函数的所有参数。无论函数定义了多少个参数,Arguments对象都会包含所有实际传递的参数。这篇深度研究主要探讨了Arguments对象的几个...
logInfo(@"User %@ just logged in with age: %d", @"Bob", 30); ``` 通过这种方式,Variadic Arguments增强了代码的灵活性和可扩展性,使得函数能够适应各种不同的输入情况,而无需为每种可能的参数组合创建单独的...
Dimensional reasoning, scale arguments, and similarity rules are introduced at the beginning and are applied throughout.A discussion of Reynolds stress and the kinetic theory of gases provides the ...
例如,一个函数可以接收任意数量的参数,我们可以通过arguments[0]、arguments[1]、arguments[2]等来访问第一个、第二个、第三个参数。 ```javascript function showArgs() { for (var i = 0; i < arguments....
在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,尤其在处理函数参数时。它不是一个数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径,无论这些参数是否在函数定义中声明。`...
JavaScript中的`arguments`对象是一个非常重要的特性,尤其在处理不确定数量的函数参数时。它不是一个真正的数组,但具有数组类似的行为,允许我们访问函数调用时传入的所有参数。在这个文档中,我们将深入探讨`...