任何精通lisp的人都可以向我解释这个笑话吗?我已经对函数式编程语言进行了一些阅读,并且知道CAR/CDR意味着地址/减量寄存器的内容,但我仍然不太了解幽默.
List 有两个方法指定将元素添加到(不可变)列表:
+:(实施Seq.+:),和::(仅在中定义List)+: 技术上有一个更通用的类型签名 -
def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That
def ::[B >: A](x: B): List[B]
Run Code Online (Sandbox Code Playgroud)
-丁忽略隐式的,它根据该文档信息仅需要That是List[B],签名是等效的.
List.+:和之间有什么区别List.::?如果它们实际上是相同的,我认为+:最好避免取决于具体实施List.但是为什么定义了另一个公共方法,客户端代码何时会调用它?
还有一个用于::模式匹配的提取器,但我想知道这些特定的方法.
为什么cons在这个上下文中使用lazy-seq,但是conj没有?
这有效:
(defn compound-interest [p i]
(cons p (lazy-seq (compound-interest (* p (+ 1 i)) i))))
Run Code Online (Sandbox Code Playgroud)
这不会(它给出堆栈溢出[1]异常):
(defn compound-interest2 [p i]
(conj (lazy-seq (compound-interest2 (* p (+ 1 i)) i)) p))
Run Code Online (Sandbox Code Playgroud)
[1]哦,你好!在stackoverflow上询问涉及堆栈溢出的问题.
我对Scala编程语言很陌生,在我在这里讲课时,正在尝试一些困扰我的想法.
我想我无法理解cons运算符是如何工作的,这里有一些我尝试过的东西:
我创建了一个伪随机数生成器,然后尝试创建一个随机值的列表:
scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Run Code Online (Sandbox Code Playgroud)
但它试图将List(3)传递给nextnt方法.当我使用paratheses时,没有问题
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
Run Code Online (Sandbox Code Playgroud)
我对执行顺序感到好奇,所以我创建了一个检查它的函数
scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int
scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
如输出中所示,执行顺序与外观顺序相同.然后我认为它可能是关于'nextInt'功能,然后我尝试了以下:
scala> 1 + …Run Code Online (Sandbox Code Playgroud) (免责声明 - 我知道Seqs在Clojure中的重要性)
在常见的lisp中,cons函数可用于将两个符号组合成一个列表:
(def s 'x)
(def l 'y)
(cons s l)
Run Code Online (Sandbox Code Playgroud)
在clojure中 - 你只能使用一个序列 - 缺点还没有扩展到使用两个符号.所以你必须写:
(def s 'x)
(def l 'y)
(cons s '(l))
Run Code Online (Sandbox Code Playgroud)
在Clojure中有更高级别的模式可以解释Common LISP和Clojure之间的这种差异吗?
我已经从4clojure.com解决了45个问题,我注意到我尝试使用递归和累加器解决一些问题的方式中反复出现问题.
我会试着解释一下我能做的最好的事情,最终得到一些非常好的解决方案,希望有些Clojurers会"得到"我没有得到的东西.
例如,问题34要求编写一个函数(不使用范围),将两个整数作为参数并创建一个范围(不使用范围).简单地说你做(... 1 7)然后你得到(1 2 3 4 5 6).
现在这个问题不是解决这个特殊问题.
如果我想使用递归和累加器来解决这个问题怎么办?
我的思维过程是这样的:
我需要编写一个带两个参数的函数,我从(fn [xy])开始
我需要递归,我需要跟踪一个列表,我将使用累加器,所以我在第一个函数中写了第二个函数,需要另外一个参数:
(fn [xy]
((fn g [xy acc] ...)x y'())
(显然我无法在SO上正确格式化Clojure代码!?)
在这里,我已经不确定我是否正确地执行了它:第一个函数必须使用两个整数参数(而不是我的调用)并且我不确定:如果我想使用累加器,我可以使用累加器而不创建嵌套函数?
然后我想连词,但我不能这样做:
(conj 0 1)
Run Code Online (Sandbox Code Playgroud)
所以我做了奇怪的事情,以确保我先得到一个序列,我最终得到这个:
(fn
[x y]
((fn g [x y acc] (if (= x y) y (conj (conj acc (g (inc x) y acc)) x)))
x
y
'()))
Run Code Online (Sandbox Code Playgroud)
但是这产生了这个:
(1 (2 (3 4)))
Run Code Online (Sandbox Code Playgroud)
而不是这个:
(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)
所以我最终做了一个额外的压扁,它的工作原理,但它是完全丑陋的.
我开始理解一些事情,我甚至开始,在某些情况下,以更多的方式"思考",但我在编写解决方案时遇到了问题.
比如我在这里决定: …
在OCaml中,有没有办法自己引用cons运算符?
例如,我可以使用(+)和( * )作为int -> int -> int函数,但我不能(::)用作'a -> 'a list -> 'a list函数,如下例所示:
# (+) 3 5;;
- : int = 8
# ( * ) 4 6;;
- : int = 24
# (::) 1 [2;3;4];;
Error: Syntax error: operator expected.
Run Code Online (Sandbox Code Playgroud)
有没有办法产生一个像(::)以外的结果fun x y -> x::y?有谁知道为什么(::)没有在OCaml中实现?
我听说clojure没有大多数lisp语言的cons细胞.
这是否意味着clojure列表不以空列表结尾?
任何人都能解释这究竟意味着什么?
我来自一个迫切的背景,但这些天我在LISP(普通LISP)上尝试
我读到这里大约cons是
(cons x L):
给定LISP对象x和列表L,求值(cons x L)创建一个包含x的列表,后跟L中的元素.
当我故意不使用列表作为第二个参数时,即我使用时
(cons 'a 'a)我期待一个错误,但哇!我有(A . A).
我错过了什么,是 (A . A)什么?
我正在学习Lisp,我对Lisp编程没有经验.在我的部分学习中,我遇到了以下例子:
> (cons ‘a ‘(a b)) ----> (A A B)
> (cons ‘(a b) ‘a) ----> ((A B).A)
Run Code Online (Sandbox Code Playgroud)
我想知道为什么当我们(cons'a'(ab))时,响应是(AAB),为什么当我们稍微改变它并把'a after (ab)时,响应是一个虚线列表就像((AB) ).A)?第一个代码行和第二个代码行有什么区别?这些代码背后发生了什么?