我正在学习Scheme,来自C / C ++背景。我已经习惯于将相关值放到结构中,并且我发现Scheme的记录对此非常有效。
如果发现自己经常这样做以避免在功能体中出现视觉噪声:
(define (f pt z)
(let*
((x (point-x pt))
(y (point-y pt))
(d (* x y z)))
...)
pt
是point
记录的地方。有没有更短的方法来绑定/破坏记录的字段?理想情况下,这可以在let
绑定内工作,但是我无法找到一种方法来编写可以完成此操作的宏,或者甚至可以做到这一点。
答案 0 :(得分:4)
在球拍中,我们可以使用match
来破坏记录的字段。如果这是一种更好的方法,则值得商......
// error handling (reject/catch) omitted for brevity.
function fn1 (val) {
return new Promise(resolve => {
resolve('foo ' + val)
})
}
function fn2 (val) {
return new Promise(resolve => {
resolve('bar ' + val)
})
}
Promise.all([fn1(1), fn2(2)])
.then(result => console.log(result))
答案 1 :(得分:1)
如果您使用的是chez方案,建议在这里使用Alex Shinn的比赛端口:https://github.com/fedeinthemix/chez-matchable。您可以将它与chez的r6rs记录进行匹配(在许多其他事情中)。
答案 2 :(得分:0)
自从我问了这个问题以来,我在Scheme宏上变得更好,并且我目前正在使用此宏:
## so far I know how to apply the histogram equalization to the entire image
import cv2
import numpy as np
from matplotlib import pyplot as plt
## load image
img = cv2.imread('/home/pi/Downloads/bear.bmp',0)
## equalize
equ = cv2.equalizeHist(img)
plt.subplot(111),plt.imshow(equ, cmap = "gray"),plt.title('Equalized')
plt.xticks([]), plt.yticks([])
plt.show()
哪个语法如下:
(define-syntax derecord
(syntax-rules ()
((_ record ([name record-accessor] ...) body-forms ...)
(let ([name (record-accessor record)] ...)
body-forms ...))))
这只比在let中手动完成要好一些,但是我想我会把它发布给像我这样的其他初学者。