[Q] Implementing Lisp/Scheme REPL(TCP) for Photon

Though I have little experience on implementing Lisp/Scheme, I managed to run TCPServer
which works like REPL thingy.

Are there any reference or example code for parsing S-Expression which I can apply to
photon (.ino code)?

Thanks you in advance.

My current test code. If anyone might have interest on implementing telnet like code.

#define SERVER_PORT 23
#define BUFSIZ 1024

#define PROMPT  "[NeXT] "
#define RECVHDR "  << "

#define ERR_MSG_BUFSIZ "  << BUFFER SIZE ERROR"

TCPServer server = TCPServer(SERVER_PORT);
TCPClient client;

int nRead = 0;
char bufRead[BUFSIZ];

char ipStr[24];

void
setup () {
  IPAddress myIP = WiFi.localIP();
  sprintf(ipStr, "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);

  pinMode(D7, OUTPUT);

  Particle.variable("ip", ipStr);

  server.begin();
}

void
loop () {
  if (client.connected()) {
    digitalWrite(D7, HIGH);

    while (client.available()) {
      char ch = client.read();

      if (ch == '\n') {
        processRequest();
        prepareNextRequest();
      } else {
        if (nRead < BUFSIZ) {
          bufRead[nRead] = ch;
          nRead++;
        } else {
          server.println(ERR_MSG_BUFSIZ);
          processRequest();
          prepareNextRequest();
        }
      }
    }
  } else {
    digitalWrite(D7, LOW);

    nRead = 0;
    bufRead[nRead] = '\0';

    client = server.available();
    client.flush();

    server.print(PROMPT);
  }
}

void
prepareNextRequest () {
  server.println("");
  server.print(PROMPT);
  nRead = 0;
  bufRead[nRead] = '\0';
}

void
displayRECVHDR () {
  char buf[16];
  size_t n = sprintf(buf, RECVHDR);
  server.write((uint8_t *)buf, n);
}

void
processRequest () {
  if ((nRead >= 1) && (bufRead[nRead - 1] == '\r')) {
    nRead--;
  }
  if (nRead > 0) {
    displayRECVHDR();
    parseRequest();
  }
}

void
parseRequest () {

#define WIFI_LOCALIP_CMD "wifi localIP"
#define WIFI_SSID_CMD "wifi ssid"
#define WIFI_SCAN_CMD "wifi scan"
#define EXIT_CMD "exit"

  if (CMD(WIFI_LOCALIP_CMD)) {
    IPAddress myIP = WiFi.localIP();
    sprintf(ipStr, "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]);
    server.print(ipStr);
    Particle.variable("ip", ipStr);
  } else if (CMD(WIFI_SSID_CMD)) {
    server.print(WiFi.SSID());
  } else if (CMD(WIFI_SCAN_CMD)) {
    server.print("scanning...");
    WiFiAccessPoint aps[10];
    int nFound = WiFi.scan(aps, 10);
    server.println("");
    for (int i = 0; i < nFound; i++) {
      WiFiAccessPoint& ap = aps[i];
      server.print("  [");
      server.print(i);
      server.print("] SSID:  ");     server.println(ap.ssid);
      server.print("      SECU:  ");
      switch (ap.security) {
      case UNSEC:
        server.println("OPEN");
        break;
      case WEP:
        server.println("WEP");
        break;
      case WPA:
        server.println("WPA");
        break;
      case WPA2:
        server.println("WPA2");
        break;
      }
      server.print("      CHNL:  "); server.println(ap.channel);
      if (i == (nFound - 1)) {
        server.print("      RSSI: "); server.print(ap.rssi);
      } else {
        server.print("      RSSI: "); server.println(ap.rssi);
      }
    }
  } else if (CMD(EXIT_CMD)) {
    server.print("bye");
    client.stop();
  } else {
    server.print("invalid command: ");
    server.write((uint8_t *)bufRead, nRead);
  }
}

bool
CMD (char *cmd) {
  int nCmd = strlen(cmd);
  return ((nRead >= nCmd) && !strncmp(bufRead, cmd, nCmd));
}