我已经使用Emacs几个月了,我想开始使用elisp编程.具体来说,我想写自己的interactive功能.但是,我有点失落.(interactive ...)有很多选择,我不确定我想要哪一个.然后,我真的不知道我需要的功能的名称.如果有人能帮我把我的伪代码变成真正的代码,我会非常感激!(和往常一样,任何提供信息的地方的链接都会很好.现在我刚读过这篇文章.)
这是我想要做的伪代码:
(defun my-func (buffer) ; I think I need the buffer as an arg?
"does some replacements"
(interactive ???) ; ?
(let (replacements (list
'("a-regexp-string" . "a-replacement-string-with-backreferences")
...)) ; more of the above
(while replacements
(let (current (car replacements)) ; get a regexp-replacement pair
(some-regexp-replace-func buffer (car current) (cdr current)) ; do the replacement
(setq replacements (cdr replacements))))))
Run Code Online (Sandbox Code Playgroud) 这个问题出现在阅读关于应用函子的优秀的Learn You a Haskell的新篇章中.
作为Maybe实例的定义的一部分,Applicative类型类具有:
pure = Just
Run Code Online (Sandbox Code Playgroud)
如果我只是去GHCi并导入Control.Applicative,并执行:
pure (3+)
Run Code Online (Sandbox Code Playgroud)
我没有得到任何东西(有道理).但是,如果我在表达式的一部分中使用它:
pure (3+) <*> Just 4
Run Code Online (Sandbox Code Playgroud)
我得到的只是7.我想这也就不足为奇了,但是我错过了关于类型类如何工作的一些不可或缺的东西,我认为,pure这里的调用没有含糊之处.
如果我的困惑有意义,任何人都可以详细解释发生了什么吗?
通常看来以下是非法的:
class Foo a where
foo :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)
这是有道理的; 我们怎么知道是什么b?
但是,如果我们看看Functor的定义:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
我们看到a并b显示,即使我们只指定f为类型变量.我猜这是允许的,因为编译器看到例如f a并且可以发现它f本身必须采用a,所以a在我们的Functor定义中使用它是安全的.我对么?
当我尝试使用无点功能样式进行编程时,"点符号"与对象和记录一起工作的方式受到了阻碍(我认为这是一种使用默认情况下的功能语言的简洁方法).
是否有一个我缺少的操作员或功能,让我做一些像:
(.) object method而不是object.method?
(从我读到的关于new ?运算符的内容来看,我认为它的工作原理是这样的.除了它需要定义并进入整个动态绑定之外,我认为我不需要它.)
换句话说,我可以将一个方法作为参数应用于其对象,就像我将一个普通函数应用于它的参数一样吗?
我有一个我正在考虑用F#做的项目,但我对这门语言还很新.我需要一个简单的数据库,希望它易于使用.sqlite适用于F#项目吗?其他建议?
为什么我们需要"附加属性"?它的概念让我有点烦恼,因为你可以想象设置特定DependencyObject上甚至不存在的属性值(并且它们将被默默地忽略).它几乎看起来像是一个寻找问题的解决方案 - 为什么不只是像HTML那样做,并让父元素明确地确定儿童定位等事情?
也就是说,而不是:
<Grid>
<Grid.ColumnDefinitions>
<!-- etc. -->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<!-- etc. -->
</Grid.RowDefinitions>
<SomeElement Grid.Column="0" Grid.Row="0" />
<!-- etc. -->
</Grid>
Run Code Online (Sandbox Code Playgroud)
为什么不是这样的(相当于<tr>和<td>在HTML中):
<Grid>
<Grid.Row>
<Grid.Column>
<SomeElement />
</Grid.Column>
<!-- etc. -->
</Grid.Row>
</Grid>
Run Code Online (Sandbox Code Playgroud)
也许网格只是一个不好的例子,附加属性在其他环境中更有意义?或许我完全错过了一些东西?
我想知道为什么我不能只是演员(我有一个模糊的想法,这可能与那个共同/逆转的东西有关?),我被迫将第一个字典的元素复制到新的字典中得到我想要的类型?
虽然我当然熟悉自动属性,但我在工作中遇到过这个问题,这似乎是一个截然不同的野兽:
public SomeType SomeProp
{
get
{
return someField;
}
set
{
}
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶它甚至编译,我想它一定是一个bug:该属性似乎允许设置,但这样做绝对没有.
这个结构有用吗?电梯中的那些"关门"按钮是不是做了什么,但让用户感觉良好?
在最近的一个问题中,我询问了'操作,并了解到它用于获取某些类型的语言定义的"属性".从我可以收集的内容来看,无法为您的类型创建自己的属性.
我遇到了一些我不理解的代码:
function Image(C: Ada.Containers.Count_Type) return String renames
Ada.Containers.Count_Type'Image;
Run Code Online (Sandbox Code Playgroud)
这是做什么的?
我正在通过F#阅读一个非常流行的wikibook.在List Comprehensions部分的底部,它解释了可以使用箭头运算符而不是yield/yield!关键字.但它注意到这已被弃用.我想知道为什么?
如果已经有人问过,请随时给我指出其他答案!
我本月刚刚发布新版本的F#.我有OO和函数语言的一些背景知识(Haskell和Scheme,但不是OCaml/ML).到目前为止,已经出现了几个问题,而不是阅读F#CTP附带的小教程.
1)可变变量优于monad吗?如果是这样,那么在F#中完全避开monad吗?
2)我对使用的大小写感到困惑.在本教程代码文件中,有时函数以小写字母开头,有时以大写字母开头.我知道MS倾向于喜欢带有函数和方法的初始大写,但在这里似乎有两种方法可以做到这一点.这对我来说并不是什么大不了的事,因为我只是在自己的时间玩耍,但我很好奇标准是什么.
3)我对OO和功能样式的整体组合感到非常困惑.print_string "string"有道理,但接下来就是List.map fn list(除非List只是命名空间,如果是这样,请原谅我).然后是str.Length.任何人都在关心何时使用什么,哪个更受欢迎?
谢谢!
我有一个方法:
void Foo::Bar(const std::string &str)
{
printf("%d", str.length());
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,它可以无缝地工作
foo.Bar("hello");
Run Code Online (Sandbox Code Playgroud)
我以为"hello"是const char *,不是std::string?
有很多关于前向声明和不透明类型的问题,但大多数似乎是从库作者的角度来看的,或者人们试图使用没有指针的不完整类型等。
我正在使用一个接口接受/返回FOO *指针的库。我想确认我不能(或不应该)以某种方式向前声明FOO或FOO *在我的头文件中(它定义了一个带有FOO *成员的结构)。
我知道我可以只#include <library.h>在我的头文件和我的 .c 文件中,但由于这实际上只是一个学习项目,我想得到澄清。(一方面,前向声明似乎是可能的,因为我的结构成员只是一个指针,因此它的大小在不知道是什么的情况下是已知的FOO——但另一方面,我不知道它是否有效/聪明的typedef东西,FOO当库已经这样做。)
提前致谢!