`
yangdong
  • 浏览: 66452 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Named arguments in Clojure

 
阅读更多
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
分享到:
评论

相关推荐

    End-to-End Arguments in System Design(端到端设计)

    《端到端设计在系统架构中的应用》一文由J.H. Saltzer、D.P. Reed和D.D. Clark撰写,出自麻省理工学院计算机科学实验室。本文旨在探讨分布式计算机系统中功能模块放置的设计原则,重点阐述了一种被称为“端到端”...

    END-TO-END ARGUMENTS IN SYSTEM DESIGN

    ### 端到端论证在系统设计中的应用 #### 引言 《端到端论证在系统设计中的应用》是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 Arguments in System Design》是一篇经典的网络组成原理论文,它提出了一个重要的设计理念——端到端设计原则(End-to-End Principle)。该...

    Finding, Scoring and Explaining Arguments in Bayesian Networks_贝

    在本文"Finding, Scoring and Explaining Arguments in Bayesian Networks"中,作者Jaime Sevilla提出了一种新的方法来解释贝叶斯网络,该方法关注于定义概率论中的论据及其提供的证据。 首先,论文引入了一个新的...

    arguments对象的使用

    在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,特别是在处理函数参数时。它不是一个真正的数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径。无论函数定义了多少个形式参数...

    JS:arguments

    ### JavaScript中的`arguments`对象详解 在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这...

    前端开源库-arguments-extended

    "arguments-extended"就是一个这样的开源库,专为处理JavaScript中的`arguments`对象提供了一系列实用方法,旨在增强参数操作的灵活性和便利性。 `arguments`对象在JavaScript中是一个特殊的对象,它在函数内部可用...

    AIX系统搭建WebLogic10+apache平台 AIX系统搭建WebLogic10+apache平台

    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 在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确...

    inputparms.java源程序

    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 end arguments vs. the brave new world

    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

    Passing arguments to Python functions

    twostar(1, 2, 3) # TypeError: twostar() takes 0 positional arguments but 3 were given ``` #### 四、综合应用 Python 允许在同一函数定义中同时使用这三种参数类型。这样可以创建功能更强大的函数,能够灵活...

    A Rulebook for Arguments

    《A Rulebook for Arguments》(《论证的规则手册》)是由Anthony Weston所著的关于逻辑论证、辩论和批判性思维的指南书籍,此书自1987年首次出版以来,一直广受好评,并已更新至第三版。本书不仅适用于学术界,同样...

    Arguments是进行函数调用.doc

    在JavaScript编程语言中,函数是核心的组成部分,而`Arguments`对象则是JavaScript函数的一个独特特性。这个对象在函数调用时被自动创建,用于存储所有传递给函数的实际参数,无论这些参数是否在函数声明中定义。`...

    Arguments对象作用深度研究.pdf

    Arguments对象是JavaScript中一个特殊的数据结构,主要用于在函数内部存储传递给函数的所有参数。无论函数定义了多少个参数,Arguments对象都会包含所有实际传递的参数。这篇深度研究主要探讨了Arguments对象的几个...

    iphone开发实例 04-Variadic Arguments

    logInfo(@"User %@ just logged in with age: %d", @"Bob", 30); ``` 通过这种方式,Variadic Arguments增强了代码的灵活性和可扩展性,使得函数能够适应各种不同的输入情况,而无需为每种可能的参数组合创建单独的...

    A first course in turbulence

    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 ...

    js arguments对象应用介绍

    例如,一个函数可以接收任意数量的参数,我们可以通过arguments[0]、arguments[1]、arguments[2]等来访问第一个、第二个、第三个参数。 ```javascript function showArgs() { for (var i = 0; i < arguments....

    js中arguments的用法(实例讲解).docx

    在JavaScript编程语言中,`arguments`对象是一个非常重要的特性,尤其在处理函数参数时。它不是一个数组,而是一个类数组对象,提供了访问函数调用时传递的所有参数的途径,无论这些参数是否在函数定义中声明。`...

    【JavaScript源代码】JavaScript中arguments的使用方法详解.docx

    JavaScript中的`arguments`对象是一个非常重要的特性,尤其在处理不确定数量的函数参数时。它不是一个真正的数组,但具有数组类似的行为,允许我们访问函数调用时传入的所有参数。在这个文档中,我们将深入探讨`...

Global site tag (gtag.js) - Google Analytics