小编sca*_*ape的帖子

删除clojure中的#inst和#uuid文字

我有一个UUID和java util日期,它将文字作为#uuid和#inst,如何在不引用文字本身的情况下指定uuid或日期?clj-json不喜欢处理它们,当我尝试生成字符串时最终会抛出错误

{:timestamp (java.util.Date.)}
;{:timestamp #inst "2013-05-17T13:45:24.095-00:00"}

;but as a string the date changes format
{:timestamp (str (java.util.Date.))}
{:timestamp "Fri May 17 09:45:44 EDT 2013"}

(json/generate-string {:uuid (java.util.UUID/randomUUID)}) 
;#uuid "d66cf77f-13b6-4291-95cd-c2bb40aa36b3"

java.lang.Exception: Cannot generate d66cf77f-13b6-4291-95cd-c2bb40aa36b3
JsonExt.java:96 clj_json.JsonExt$Generator.generate
JsonExt.java:83 clj_json.JsonExt$Generator.generate
JsonExt.java:103 clj_json.JsonExt.generate
core.clj:18 clj-json.core/generate-to-writer
core.clj:26 clj-json.core/generate-string
NO_SOURCE_FILE:32 myapp.handler/eval8390
Run Code Online (Sandbox Code Playgroud)

json clojure literals

7
推荐指数
3
解决办法
2592
查看次数

在Clojure中删除原子列表中项目的最佳方法

我正在使用server.socket将数据流式传输到多个客户端,server.socket为每个客户端连接使用Threads.我目前有这样的事情:

(def clients (atom ())) ; connected clients defined globally for that namespace

(swap! clients conj a)  ; adds a client (which is an atom itself as well), this is in a function that is run on the client's thread

;I want to better the process of removing a client!
(dosync (reset! clients (remove #{a} @clients))) ; removes client from list, run in a function on the client's thread
Run Code Online (Sandbox Code Playgroud)

我运行一个遍历每个客户端并抓取内容的函数,它在每个多个客户端线程上处于无限循环中,因此它同时运行:

(doseq [c @clients]
  (print ((deref c) :content))
  (flush))
Run Code Online (Sandbox Code Playgroud)

我在线程中使用Atoms的结论确实让程序顺利运行并允许非阻塞读取,所以我对此感到满意,除非我觉得重置全局客户端的Atom只是为了让我可以从中删除单个客户端这个名单是一个糟糕的举动.有没有更合适的方法来实现这一点使用交换!?我为clients atom选择了list,因为我在每个连接的客户端上运行doseq来获取内容并将其刷新到输出流套接字.

multithreading atomic clojure

4
推荐指数
1
解决办法
1218
查看次数

在XNA中,处理不再需要的纹理的最佳方法是什么?

我开始了一个项目,其概念是在整个游戏中不断重复使用相同的texture2d对象,定期重新加载新纹理.随着时间的推移,我在运行时遇到了一个坏主意:System.OutOfMemoryException

    bool loadImages(string image)
    {
        System.Diagnostics.Debug.WriteLine("beginning loading textures " + image);

        try
        {
            //image_a = null;
            //image_o = null;

            //image_o.Dispose();
            //image_a.Dispose();

            image_o = Content.Load<Texture2D>("images/"+image);
            image_a = Content.Load<Texture2D>("images/" + image+"_a");


            return true;
        }
        catch 
        { 
            System.Diagnostics.Debug.WriteLine("cannot load textures " + image);         
            image_a.Dispose(); 
            image_o.Dispose(); 
        }

        return false; //make sure the caller loads the subsequent image
    }
Run Code Online (Sandbox Code Playgroud)

我猜想XNA在每次新的内容加载时都会保留过去的纹理,所以我重新编写了程序,而是保存一个游戏对象列表,每个对象都有自己的texture2d对象.在浏览列表后,我将处理前一个列表项的纹理对象,并将下一个列表项的纹理加载到其纹理对象.该列表只会在整个游戏中遍历一次,我只是定期进入下一个纹理集,我只会选择加载2个纹理,所以理论上应该始终只需要内存中的2个纹理.我仍然遇到内存错误.这就好像我完全不能依赖dispose方法及时释放内存中的纹理.

我正在加载的纹理都没有超过125KB,我正在为Windows Phone 7构建这个

删除不再需要的纹理的最佳方法是什么?参考代码:我应该创建新的texture2d对象,交换它们,并处理原件吗?

xna textures memory-management out-of-memory

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

在clojure中顽固循环,不要得到评估

我有以下代码:

(do
  (prn "sleeping for 60 seconds")
  (Thread/sleep 6000)
  (prn "kicking off calendar downloads @ " (new java.util.Date))
  (let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
   (map download links))
Run Code Online (Sandbox Code Playgroud)

我注意到let评估必须是最后的,否则它不会被评估.这对我来说很困惑.尽管如此,当我在循环中实现它时,let永远不会进行评估,因为我认为recur最终会被推断出来.

(while
(do
  (prn "sleeping for 60 seconds")
  (Thread/sleep 60000)
  (prn "kicking off calendar downloads @ " (new java.util.Date))
  (let [links (map #(clojure.string/split % #",") (clojure.string/split (clojure.string/replace (slurp "calendars.csv") #"\r" "") #"\n"))]
   (map download links))
  )) 
Run Code Online (Sandbox Code Playgroud)

我也希望sleep在本do节末尾,但这真的没有实际意义.

我怎样才能 …

loops clojure

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