考恩就在这段片段的末尾。它要求您编写一个函数来将一个映射转换为一个字符串,然后在它前面加上一个全名。
下面的解决方案运行良好。我只是想知道是否有更简单或更有效的方法来做同样的事情。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Solution
(defn str-addr [addr]
"Turn a map of address into a string in the format of STREET, CITY, STATE"
(let [{:keys [street-address city state]} addr]
(str street-address ", " city ", " state)
)
)
(defn prefix-name-to-addr [[fn ln] addr]
"Prepend names to an address."
(let [
name-string (str fn " " ln)
addr-string (str-addr addr)
]
(str name-string ", " addr-string)
)
)
; (prefix-name-to-addr ["Victoria" "Leong"] test-address)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def test-address
{:street-address "123 Test Lane"
:city "Testerville"
:state "TX"})
"All together now! Fill in a function to make the follow expression eval to true."
(= "Test Testerson, 123 Test Lane, Testerville, TX"
(prefix-name-to-addr ["Test" "Testerson"] test-address))发布于 2015-01-17 11:48:40
性能在这里不是一个问题,只是没有足够的工作来使这成为一个关注。由于同样的原因,这篇评论也太过分了,所以如果您想在一个比大约20行更大的程序中使用这段代码,我将讨论应该更改的内容。我的命名建议可能不是习以为常的,我不知道。
因此,就风格而言,首先要注意的是,括号不应该像这样单独使用。如果您的编辑器使它变得困难,获得一个将自动保持结构正确和缩进正确。
接下来,str-addr的docstring缺少一个句号,单个字符串("All together now! ..")每行超过80个字符。
我不喜欢缩写。addr比address略短,但实际上,str-addr并不是最容易破译的。
现在这个函数所做的并不是将一个地址真正地转换成一个字符串(不是一个地址的映射,这个程序中的一个地址被隐含地定义为一个包含(至少) street-address、city、state三个字段的映射,所以把它当作一种数据类型对待),而是格式化它以供人工显示。所以更好的名字应该是format-address,print(able)-address,readable-address等等。
您可以使用map甚至juxt直接提取字段,而不是析构。这将节省该函数中的另一行,而代价是使用关键字指定字段。
然后,使用join from clojure.string将字符串与分隔符连接起来,如果您有更多的参数,则会更加简洁。如果您有更复杂的格式,请使用format。
prefix-name-to-address可以建议它将一个prefix-name转换成一个地址--我可能会使用一个完全不同的名称。它所做的是格式化一个完整的地址行,所以类似于format-full-address。另外,您的名称数据类型,一个向量,在这里是非常有限的。至少,通过不限制一个人可以拥有的名字的数量,你会变得更加灵活,同时代码也会更小。
因此,如果我将这些建议合并到代码中,则如下所示:
(use 'clojure.string)
(defn format-address [address]
"Turn an address into a string in the format of 'STREET, CITY, STATE'."
(join ", " (map address [:street-address :city :state])))
(defn format-name [name]
"Turn a name (a sequence of first name to last name) into a string."
(join " " names))
(defn format-full-address [name address]
"Prepend a name to an address."
(join ", " [(format-name name) (format-address address)]))
(def test-address
{:street-address "123 Test Lane"
:city "Testerville"
:state "TX"})
;; All together now! Fill in a function to make the follow expression eval to true.
(= "Test Testerson, 123 Test Lane, Testerville, TX"
(format-full-address ["Test" "Testerson"] test-address))https://codereview.stackexchange.com/questions/77711
复制相似问题