小编use*_*355的帖子

你能解释一下这个LISP函数以及为什么问题出现在动态范围内吗?

在阅读一些lisp历史时,从LISP 1到LISP 1.5,我遇到了这个功能:

(define (testr x p f u)
  (if (p x)
      (f x)
      (if (atom? x)
          (u)
          (testr (cdr x)
                 p
                 f
                 (lambda ()
                   (testr (car x) p f u))))))
Run Code Online (Sandbox Code Playgroud)

麦卡锡认为,"困难在于当内部递归发生时,car [x]所需的值是外部值,但实际使用了内部值.在现代术语中,需要词法范围,并获得动态范围. ".

我无法弄清楚他所指的是什么"外部价值"和"内在价值",也无法看到在使用动态范围进行评估时这个函数是如何行为不当的.我能理解lambda是否有些阴影'x',但它是零参数的函数.

(实际上很难找到这个功能,因为它似乎从网页本身中遗漏了.只是在浏览了images.tex文件之后:http://www-formal.stanford.edu/jmc/history/lisp /images.tex,我发现它).

lisp scoping dynamic-scope lexical-scope

2
推荐指数
1
解决办法
63
查看次数

如何获取存储在unique_ptr中的指针的地址?

我正在尝试使用带有c ++的SDL2库,因此,某些函数需要一个指向SDL_Window或SDL_Renderer的双指针.我为一个SDL_Window设置了一些内存并将其赋予一个如此独特的指针:

window = unique_ptr<SDL_Window, decltype(free) *>
    reinterpret_cast<SDL_Window *>(malloc(sizeof(SDL_Window))),
    free};
Run Code Online (Sandbox Code Playgroud)

我使用以下网站作为指南:http://www.codeproject.com/Articles/820931/Using-std-unique-ptr-RAII-with-malloc-and-free

所以现在我需要一个指向存储在unique_ptr中的指针的指针,但是我很难这样做.我尝试过这样的事情:

&window.get()
// or
&&(*window)
// or
&window
// and even
&(&(*(window.get())))
Run Code Online (Sandbox Code Playgroud)

所有这些都导致奇怪的编译器错误,例如一元'&'运算符需要l值,这对于第一个和最后一个案例是完全可以理解的.

更新 我现在还使用原始SDL_Window*来获取unique_ptr的地址和.我的一些代码片段(虽然脱离了上下文):

SDL_Window *window_ptr;
unique_ptr<SDL_Window> window;

window = unique_ptr<SDL_Window, decltype(SDL_DestroyWindow)> (
    window_ptr,
    SDL_DestroyWindow);

SDL_CreateWindowAndRenderer(500, 500, SDL_WINDOW_SHOWN, &window_ptr, &renderer_ptr);
Run Code Online (Sandbox Code Playgroud)

但现在,我正在运行此编译器错误:

/usr/include/c++/5/bits/unique_ptr.h:272:18: error: no match for ‘operator=’ 
(operand types are ‘std::unique_ptr<SDL_Window>::deleter_type 
{aka std::default_delete<SDL_Window>}’ and ‘void (*)(void*)’)
get_deleter() = std::forward<_Ep>(__u.get_deleter());
Run Code Online (Sandbox Code Playgroud)

c++ pointers unique-ptr

-3
推荐指数
1
解决办法
2954
查看次数